php将图像文件移动/复制到linux中的新目录/文件夹结构

时间:2013-04-04 16:33:01

标签: php file filesystems

我有一个php / mysql网站,用户可以在其中创建列表并上传多个图像(每个图像大小为3个)。我犯了将图像存储在文件夹中的错误,如下所示:

images/listings/listing_id/image-name.jpg
images/listings/listing_id/thumbs/image-name.jpg
images/listings/listing_id/large/image-name.jpg

不幸的是,现在我遇到的问题是,子目录的最大数量是30,000,我的代码中断了。

我现在要将文件夹结构更改为以下内容:

images/listings/yyyy/mm/dd/listing_id/image-name.jpg
images/listings/yyyy/mm/dd/listing_id/thumbs/image-name.jpg
images/listings/yyyy/mm/dd/listing_id/large/image-name.jpg

我决定最好的方法是创建一个php脚本来循环'images / listings /'文件夹中的所有目录,并将每个图像复制到上面指定的新目录中。或者每个'listing_id'文件夹,我需要使用mysql查找listing_id,并获取created_date然后拆分日期以获得yyyy mm dd。

我完全迷失了创建php脚本,是否可以重命名现有的目录结构而无需复制和删除旧图像,或者我是否需要复制旧图像,创建新目录,移动它们以及然后删除旧文件夹?

3 个答案:

答案 0 :(得分:0)

只要您没有任何与4位数年份相同的listing_ids,您就应该能够在现有文件夹旁边创建新的文件夹结构。

您似乎已经有了如何做的计划,您应该尝试实际编写一些代码。

提示:rename()与'move'相同。不要做“复制和删除”,除非你想要它再花费10倍。

最后,根据经验,如果可能,您应该尽量避免让任何文件夹包含超过1000个条目。如果有许多文件系统操作必须使用大型文件夹的目录索引,那么可以 降低文件系统性能。

答案 1 :(得分:0)

您可以使用

$origin = "images/listings";
$final =  "images/final";


$start = strlen($origin) + 1;
$di = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($origin, RecursiveDirectoryIterator::SKIP_DOTS));
foreach ( $di as $file ) {
    if ($file->isFile()) {
        $mtime = $file->getMTime();
        $date = sprintf("%d/%d/%d", date("Y", $mtime), date("m", $mtime), date("d", $mtime));
        $new = sprintf("%s/%s/%s", $final, $date, substr($file, $start));
        $dir = dirname($new);
        is_dir($dir) or mkdir($dir, null, true);
        rename($file, $new);
    }
}

答案 2 :(得分:0)

对于移动图像,您可以使用php的 rename()功能。

例如

  

rename("../app/temp/natural.jpeg","../public/public_photo/natural.jpeg");

上面给出的代码 / aap / temp / 文件夹中的natural.jpeg已移至文件夹 / public / public_photo /