我有以下图片上传脚本,上传图片,重命名和调整缩略图大小。上传图像(所有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';
}
}
答案 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时,您需要小心透明度......但我会将该部分留给您。