在图片上传时创建缩略图 - ' SOME'是黑色的,但其他人还可以

时间:2017-09-08 09:53:58

标签: php image-uploading

我有以下图片上传脚本,上传图片,重命名和调整缩略图大小。上传图像(所有JPG)时,一些上传和显示正常,但其他人上传主图像,但缩略图只是一个黑色方块。

有没有人知道问题是什么?

[edit]我已经将PNG添加到文件类型中,并且它正确上传,但是真实的' JPG文件现在上传黑色缩略图。我想我需要以某种方式检查文件扩展名并根据返回的内容应用imagecreatefromjpeg / imagecreatefrompng? 如果是这种情况,我在想一个if / else语句突出显示会做什么? - 不知道要检查什么来获得扩展(jpg / png)虽然......

    if(isset($_POST['submit'])){
        // get file info
        $file = $_FILES['file'];

        $fileName = $_FILES['file']['name'];
        $fileTmpName = $_FILES['file']['tmp_name'];
        $fileSize = $_FILES['file']['size'];
        $thumbName = $_FILES['file']['name']; //
        $thumbTmpName = $_FILES['file']['tmp_name']; //
        $thumbSize = $_FILES['file']['size']; //
        $fileError = $_FILES['file']['error'];
        $fileType = $_FILES['file']['type'];

        //allow file types
        $fileExt = explode('.', $fileName);
        $fileActualExt = strtolower(end($fileExt));

        $allowed = array('jpg', 'jpeg', 'png'); // ADDED PNG HERE

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

            if($fileError === 0){

                if($fileSize < 1000000){
                    $fileNameNew = $row['item_img'].".".$fileActualExt; //code!
                    $fileDestination = 'images/'.$col_id.'/'.$fileNameNew; //number
                    move_uploaded_file($fileTmpName, $fileDestination);

                    // if(???){ // START POSSIBLE IF/ELSE HERE?
                    // create thumbnail
                    $src = imagecreatefromjpeg($fileDestination);
                    list($width, $height) = getimagesize($fileDestination);
                    $thumbWidth = 100;
                    $thumbHeight = 100;

                    // } else { // POSSIBLE ELSE HERE?

                    // ADDED THIS FOR PNG
                    $src = imagecreatefrompng($fileDestination);
                    list($width, $height) = getimagesize($fileDestination);
                    $thumbWidth = 100;
                    $thumbHeight = 100;

                    // } // END POSSIBLE IF/ELSE HERE?

                    $tmp = imagecreatetruecolor($thumbWidth,$thumbHeight);
                    imagecopyresampled($tmp, $src, 0,0,0,0, $thumbWidth, $thumbHeight, $width, $height);
                    imagejpeg($tmp, 'images/'.$col_id.'/thumbs/'.$fileNameNew.'', 100);

                    imagedestroy($src);
                    imagedestroy($tmp);

                    //CHECK FOR IMAGE
                    $checkImgQuery = $db->prepare("SELECT item_image.item_image, item_item.item_id FROM item_image JOIN item_item ON item_item.item_img = item_image.item_image WHERE item_id = :item_id");
                    $checkImgQuery->execute(array(':item_id' => $item_id));
                    $check = $checkImgQuery->rowCount();

                    if($check > 0){
                        // UPDATE
                    } else {
                        // ADD
                    }
                } else {
                    $error[] = 'your file is too big';
                }

            } else {
                $error[] = 'there was an error uploading your file';
            }

        } else {
            $error[] = 'you cannot upload files of this type';
        }

}

1 个答案:

答案 0 :(得分:0)

由于它并不总是发生,这几乎肯定来自文件,因为它们是唯一改变的...我猜你的jpeg文件已损坏(但不足以不显示图片,但可能使PHP代码崩溃)或者他们只是不是真正的jpegs ...

以下是我推荐的内容:没有必要强制用户只使用一种文件类型,而PHP本身只能处理多个,所以我们可以检查mime类型并采取相应的行动。

switch(mime_content_type($fileDestination){
    case 'image/jpeg':
        $src = imagecreatefromjpeg($fileDestination);
        break;
    case 'image/png':
        $src = imagecreatefrompng($fileDestination);
        break;
    case 'image/gif':
        $src = imagecreatefromgif($fileDestination);
        break;
    default:
        $error[] = 'your file is not of a recognized type';
}

if(isset($src)){
   //do what you were doing.
}

因此我们测试mime类型并使用相应的函数。并不是说我没有包括所有内容,但这应该是一个好的开始。

如果您想要更简单的实现,可以使用:

$src = imagecreatefromstring(file_get_content($fileDestination));

从字符串创建图像时,会自动检测类型。如果文件无法识别,则返回false。

从PNG保存到JPG时,您需要小心透明度......但我会将该部分留给您。