PHP重命名文件而不实际复制它们

时间:2018-03-08 16:09:17

标签: php image copy file-handling

基本信息:

所以,有人搞砸了,打破了图像上传功能。扩展程序.已被取消......这意味着所有图片都保存为imagejpg而不是image.jpeg

我知道;没问题,我只是循环文件夹并重命名文件,对吧?容易贪心;

    public function renameImgs(){
        $dirs = array_filter(glob(DOCROOT.'/uploads/products/*'), 'is_dir');
        foreach($dirs as $dir){
            $files = glob($dir.'/*');
            foreach($files as $file){
                $filename = strtolower($file);
                $newFileName = str_replace('jpg', '.jpg', $filename);
                if(!copy($filename, $newFileName)){
                    echo "failed to copy file: $filename";

                }
                else{
                    unlink($filename);
                }
                //if(imagecreatefromjpeg($filename)){
                    //echo "Can still create image from $filename";
                //}
            }
        }
        echo "done";
    }

我也尝试过rename()函数而不是copy(),但这显然并不重要。 反正。

问题

当我这样做时,所有图片都会损坏。如果我下载后尝试在我的电脑上打开它们,图像会闪烁,然后告诉我它已损坏。虽然他们都有视觉腐败,但有一些人通过了。

当我拿回支持的文件(幸运的是我做了备份)并在我的PC(Windows)上手动重命名时,图像非常好。但是,我们在这里谈论1800张图片。当我应该能够用脚本修复它时,我真的不想手动执行此操作。

解决方案(我认为)

我觉得我可以重命名文件而不用以某种方式验证它,它应该有效吗?

imagecreatefromjpeg功能甚至没有通过一次,仅供参考。

TL; DR

我想修复图片扩展程序而不会破坏它们

1 个答案:

答案 0 :(得分:0)

Before

我在windows(xampp)上测试过,对我来说似乎很好

<?php
function renameImgs() {

 $mime = array( 
            // images
            'image/png' => 'png',
            'image/jpeg' => 'jpg',
            'image/gif'=> 'gif',
            'image/bmp' => 'bmp',
    );

    $basedir = 'upload';
    foreach (GLOB($basedir .'/*', GLOB_ONLYDIR) as $dir) {
        foreach(GLOB($dir . '/*', GLOB_BRACE) as $img) {
            $path = pathinfo($img)['dirname'];
            // mime_content_type is more reliable
            $ext = $mime[mime_content_type($img)];
            $file = strtolower(basename($img));
            $newname = $path .'/' . preg_replace('/(jpg)|(jpeg)|(gif)|(bmp)/i', '.' . $ext, $file);
            echo $newname;
            if(copy($img, $newname)) {
                unlink($img);
            };
        }
    }
}

renameImgs();
?>

After