2012-03-17 47 views
2

我听说来处理上传的图片的最好的办法就是“再处理”他们使用GD库和保存处理后的图像重新处理。见:PHP image upload security check list

我的问题是如何在GD做到这一点“再加工”?这意味着什么?我不知道GD库非常好,我怕我会乱起来......图片上传安全 - 与GD

因此,如果任何人谁这样做过你能不能给我一个这样的例子?我在这里找到了一个答案:Remove EXIF data from JPG using PHP,但是现在我不能使用ImgMagick了,顺便说一下..删除EXIF数据意味着完全重新创建这个图片。 ?情况)
(我使用Zend框架,如果有人感兴趣)

回答

4

如果用户上传JPEG文件,你可以做这样的事情重新处理:

$newIm = @imagecreatefromjpeg($_FILES['file']['tmp_name']); 
if (!$newIm) { 
    // gd could not create an image from the source 
    // most likely, the file was not a valid jpeg image 
} 

然后,您可以丢弃所述$newIm图像使用imagedestroy()和使用用户上传的文件,或从GD中保存图像并使用它。保存GD图像可能存在一些问题,因为它不是原始图像。

另一种简单的方法是将检查图像文件的头部(第几个字节),以确保它是正确的;例如所有的JPEG文件都以0xff 0xd8开头。

又见imagecreatefromstring(),你也可以使用getimagesize()到上传的图片上运行类似的检查。

+0

报价(和getimagesize)“小心 此函数希望文件名是一个有效的图像文件。如果非图像文件被提供时,它可能被错误地检测为一个图像和该函数将返回成功,但阵列可能包含无意义的值。 不要使用和getimagesize()来检查一个给定的文件是一个有效的图像,使用作为Fileinfo的扩展这种特制的解决方案,而不是“。 – 2017-07-18 19:40:11

2
function isvalidjpeg($file) 
{ 
$finfo = finfo_open(FILEINFO_MIME_TYPE); 
return is_resource($finfo) && 
     (finfo_file($finfo, $file) === 'image/jpeg') && 
     finfo_close($finfo); 
} 
if(isvalidjpeg($_FILES['file']['tmp_name'])) { 
    $newIm = @imagecreatefromjpeg($_FILES['file']['tmp_name']); .....