【问题标题】:PHP file renaming mysterious no error images lostsPHP文件重命名神秘无错误图像丢失
【发布时间】:2016-06-17 10:13:32
【问题描述】:

我有一堆随机名称的照片,我想将它们发布到网上,因此需要将它们重命名为 1.jpg、2.jpg、3.jpg 等;

我写了下面的代码来实现这个

$i = 1;
if ($handle = opendir($path)) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != ".." && is_file($path.'/'.$file)) {
            $oldname   = $path.'/'.$file;
            $path_info = pathinfo($oldname);            
            rename($oldname, $path.'/'.($i).'.'.'jpg');
            echo "Old name = <b>".$oldname."</b></br>";
            echo "New name = <b>".$path.'/'.($i).'.'.'jpg'."</b></br></br>";
            $i++;
        }
    }
    closedir($handle);
}

神奇的是,运行此脚本后文件夹中有 22 个文件,当我再次刷新时,只剩下 14 个名称为 1.jpg、10.jpg 到 22.jpg 的图片,然后只剩下 6 个名称为 1 的图片。 jpg 到 6.jpg 现在在这一点上,即使反复刷新,它们也没有改变。

我尝试注释掉 rename($oldname, $path.'/'.($i).'.'.'jpg');just 以查看生成了哪些旧名称和新名称,这些都很好,就像旧名称是新名称一样,生成了我想要的 1.jpg 到 22.jpg

我尝试了几乎相同的代码将 .JPG 扩展名更改为 .jpg 扩展名,因为 linux 服务器对文件命名是区分大小写的,而 windows 并不是这段代码一直都能正常工作;

if ($handle = opendir($path)) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != ".." && is_file($path.'/'.$file)) {
            $oldname   = $path.'/'.$file;
            $path_info = pathinfo($oldname);
            echo $sub= substr($file,0,-4);
            echo "<br>";
            rename($oldname, $path.'/'.($sub).'.'.'jpg');
        }
    }
    closedir($handle);
}

现在是印度凌晨 2:40,我只是一名学生,这个问题不让我进入睡眠模式,请帮助我。

【问题讨论】:

  • 我赌的是路径问题。打印出完整路径,检查权限...
  • 有像1.jpg22.jpg 这样的原始名称吗?如果是,那么当您尝试将其他文件之一重命名为相同名称时,您将删除这些文件。
  • 你检查过 php_errors.log 吗?
  • 不,我在本地工作,我已打开显示错误,我可以看到所有其他错误 bt 以供参考,我正在粘贴错误日志以防万一 [Thu Mar 03 21:38:54.867100 2016 ] [ssl:warn] [pid 4512:tid 260] AH01909: www.example.com:443:0 服务器证书不包含与服务器名称匹配的 ID [Thu Mar 03 21:38:55.010100 2016] [mpm_winnt:通知] [pid 4512:tid 260] AH00354: Child: 启动 150 个工作线程。 [Thu Mar 03 23:15:19.182000 2016] [authz_core:error] [pid 4512:tid 1628] [client fe80::15db:ddeb:c395:4eee:50562] AH01630:客户端被服务器配置拒绝:C
  • 是的,我原来的名字在很多文件上都有1.jpg之类的名字是这个原因吗?

标签: php file upload rename move


【解决方案1】:

通过 rethinking() 循环后,我明白了为什么这段代码不起作用以及为什么它对扩展重命名起作用。

rename 函数采用 2 个参数,文件的旧名称和带有位置的新名称,它也可以移动文件,如果在新位置或相同位置已经存在同名文件,它将简单地覆盖它并不会出现任何错误。

为了理解这一点,让我们举个例子,摄影文件夹中有 22 张图像,名称从 1.jpg 到 22.jpg,但顺序随机,如 1.jpg、10.jpg、15.jpg 等。

然后这段代码将使用 1.jpg 并将其重命名为 1.jpg 到目前为止一切顺利,但下次循环时它将使用 10.jpg(这是文件夹中的第二个文件)并使用 2.jpg 重命名好的,这就是代码所期望的,但是稍等一下,已经存在一个名为 2.jpg 的文件,它只是被代码覆盖而没有任何错误,从而导致数据丢失。

现在你会说为什么 hack 图像按 1.jpg、10.jpg 的顺序排列,如果存在 2.jpg,而不是为什么它们没有按 1.jpg 和 2.jpg 的顺序排列? 答案很简单,有些图片有 .jpg,有些 .JPG 有 .JPG 的图片优先。

要克服这个问题,您需要做大多数软件所做的事情。 WinRAR 你需要一个临时文件夹来移动文件,然后再次将文件移动到源文件夹,代码将如下所示。

<?php
$path="test";
$i = 1;
if ($handle = opendir($path)) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != ".." && is_file($path.'/'.$file)) {
            $oldname   = $path.'/'.$file;
            $path_info = pathinfo($oldname);            
            rename($oldname, "tmp".'/'.($i).'.'.'jpg');
            echo "Old name = <b>".$oldname."</b></br>";
            echo "New name = <b>"."tmp".'/'.($i).'.'.'jpg'."</b></br></br>";
            $i++;
        }
    }
    closedir($handle);
}
$path="tmp";
$i = 1;
if ($handle = opendir($path)) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != ".." && is_file($path.'/'.$file)) {
            $oldname   = $path.'/'.$file;
            $path_info = pathinfo($oldname);            
            rename($oldname, "test".'/'.($i).'.'.'jpg');
            echo "Old name = <b>".$oldname."</b></br>";
            echo "New name = <b>".$path.'/'.($i).'.'.'jpg'."</b></br></br>";
            $i++;
        }
    }
    closedir($handle);
}
?>

感谢大家没有帮助我,只是因为你我自己做了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    相关资源
    最近更新 更多