【问题标题】:Php corrupted image uploadphp损坏图片上传
【发布时间】:2021-02-04 20:35:38
【问题描述】:

我有一个照片上传区。它工作没有任何问题。但后来我开始注意到它没有上传一些图片。在其他情况下,颜色和像素开始出现错误。旧文件没有问题。只有一些新的上传。 这个问题开始自行发生,而我的代码没有任何更改。 我正在使用cropper js 裁剪照片。 不是每个上传都是这样的。我把有趣的例子留在这里。 有时它根本不加载图像。 正常工作的东西怎么会自己失败? 对不起我的英语不好。提前感谢所有帮助过的人

 $file = $_FILES['avatar'];
    $fileName = $_FILES['avatar']['name'];
    $fileTmpName = $_FILES['avatar']['tmp_name'];
    $fileError = $_FILES['avatar']['error'];
    $fileSize = $_FILES['avatar']['size'];
    $fileType = $_FILES['avatar']['type'];

    $fileExt = explode('.', $fileName);
    $fileActualExt = strtolower(end($fileExt));

    $allowed = array('jpg', 'jpeg', 'png');

    if(in_array($fileActualExt, $allowed)){

        if($fileError === 0){

            if($fileSize < 100000000){

                $fileNameNew = time().md5(time().$o_id.$fileName)."_".sha1($user_id.rand(10,99)).$l_category.".".$fileActualExt;

                $fileDestination = "photos/".$fileNameNew;


                function compressImage($source, $destination, $quality) {

                    $info = getimagesize($source);

                    if ($info['mime'] == 'image/jpeg') 
                        $image = imagecreatefromjpeg($source);

                    elseif ($info['mime'] == 'image/gif') 
                        $image = imagecreatefromgif($source);

                    elseif ($info['mime'] == 'image/png') 
                        $image = imagecreatefrompng($source);

                    imagejpeg($image, $destination, $quality);

                    return true;

                }



                compressImage($fileTmpName, $fileDestination, 90);

            }

【问题讨论】:

  • 您正在使用 Javascript 工具裁剪图像,并使用 GD 压缩它们。如果省略这些操作,您会发现这些问题吗?
  • 没有。也许 gd 库错误。我发现由于先前加载的文件损坏,可能会出现问题。但我有 30000 个文件:(
  • 现在即使我将照片文件上传到不同的cdn服务器而不裁剪它,照片也会损坏:(我在上面的答案中说不,但是当我再次测试时,我看到照片上传到我的服务器直接损坏了。很有趣..这是怎么回事?

标签: php image upload gd


【解决方案1】:

我会检查这些是否与文件类型相关。第一个和最后一个可以是带有偏移或部分应用/识别的调色板的 PNG 调色板。 中间的应该是处理错误,因为它在上部有明显的对比度分裂。

应该是某种自动曝光,在它们上运行并且未能很好地完成它的工作?

我会说这不是上传或文件错误,因为这将导致文件在错误“之后”完全被破坏,并且很可能 GD 不会对它们执行 getimagesize() 也不能使用这些文件。

还有一些 PHP 相关的提示:

pathinfo() 用于获取“最后一个”扩展名。

$fileActualExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));

imagecreatefrom* 很麻烦,但您可以使用帮助程序使其变得更好,您还应该使用 getimagesize()、imagejpeg() 和 iamgecreatefrom*() 返回值来检查它们是否真的没问题。

function getGDImage($source) {
    if (!($info = getimagesize($source))) {
        return false;
    }

    switch($info['mime']) {
        case 'image/jpeg': return imagecreatefromjpeg($source);
        case 'image/gif': return  imagecreatefromgif($source);
        case 'image/png': return imagecreatefrompng($source);
        default: return false;
    }
}


function compressImage($source, $destination, $quality) {
    return ($image = getGDImage($source))
        ? imagejpeg($image, $destination, $quality)
        : false;
}

【讨论】:

  • 非常感谢您的帮助。现在,即使我将照片文件上传到不同的 cdn 服务器而不进行裁剪,照片也会损坏:( 我在上面的答案中说不,但是当我再次测试时,我看到上传到我的服务器的照片直接损坏了。很有趣..这怎么可能?
猜你喜欢
  • 2019-05-18
  • 2017-09-13
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
相关资源
最近更新 更多