我有一个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脚本,是否可以重命名现有的目录结构而无需复制和删除旧图像,或者我是否需要复制旧图像,创建新目录,移动它们以及然后删除旧文件夹?
答案 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 /