Tôi gặp vấn đề tương tự sau khi vá 1.9.2.2 và 1.9.2.3. SUPEE-9767 thêm một phương thức xác nhận mở rộng trong
ứng dụng / mã / lõi / Mage / Core / Model / File / Trình xác thực / Image.php
Tôi đã:
public function validate($filePath)
{
$fileInfo = getimagesize($filePath);
if (is_array($fileInfo) and isset($fileInfo[2])) {
if ($this->isImageType($fileInfo[2])) {
return null;
}
}
throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid MIME type.'));
}
Và đổi thành:
public function validate($filePath)
{
list($imageWidth, $imageHeight, $fileType) = getimagesize($filePath);
if ($fileType) {
if ($this->isImageType($fileType)) {
//replace tmp image with re-sampled copy to exclude images with malicious data
$image = imagecreatefromstring(file_get_contents($filePath));
if ($image !== false) {
$img = imagecreatetruecolor($imageWidth, $imageHeight);
imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
switch ($fileType) {
case IMAGETYPE_GIF:
imagegif($img, $filePath);
break;
case IMAGETYPE_JPEG:
imagejpeg($img, $filePath, 100);
break;
case IMAGETYPE_PNG:
imagepng($img, $filePath);
break;
default:
return;
}
imagedestroy($img);
imagedestroy($image);
return null;
} else {
throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid image.'));
}
}
}
throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid MIME type.'));
}
Vấn đề dường như là imagecopyresampled
cuộc gọi mà không đặt độ trong suốt trước vì nó hợp nhất nền đen mặc định từ đó imagecreatetruecolor
.
Những gì tôi đã làm là chuyển imagecopyresampled
vào câu lệnh switch và thêm các cuộc gọi trong suốt trước đó imagecopysampled
trong trường hợp png (bạn cũng có thể sử dụng nó cho gif).
Vì vậy, bây giờ if / switch của tôi trông như thế này:
if ($image !== false) {
$img = imagecreatetruecolor($imageWidth, $imageHeight);
switch ($fileType) {
case IMAGETYPE_GIF:
imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
imagegif($img, $filePath);
break;
case IMAGETYPE_JPEG:
imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
imagejpeg($img, $filePath, 100);
break;
case IMAGETYPE_PNG:
imagecolortransparent($img, imagecolorallocatealpha($img, 0, 0, 0, 127));
imagealphablending($img, false);
imagesavealpha($img, true);
imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
imagepng($img, $filePath);
break;
default:
return;
}
imagedestroy($img);
imagedestroy($image);
return null;
}
Điều này giữ cho sự minh bạch png của tôi trong quá trình tải lên hình ảnh sản phẩm. Không biết nếu điều này sẽ giúp với watermark và rõ ràng nếu bạn sử dụng bản sao này vào thư mục địa phương của bạn.
ứng dụng / mã / cục bộ / Mage / Core / Model / File / Trình xác thực / Image.php