1

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

4

3 回答 3

0

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

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

提示:rename()与“移动”相同。除非您希望它花费 10 倍的时间,否则不要进行“复制和删除”。

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

于 2013-04-04T16:41:11.913 回答
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);
    }
}
于 2013-04-04T16:56:43.907 回答
0

对于图像的移动,可以使用 php 的rename()函数。

例如

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

上面给定的代码 natural.jpeg 来自文件夹/aap/temp/已移动到文件夹/public/public_photo/

于 2014-05-02T05:58:15.750 回答