2011-11-24 68 views
4

在PHP中,我可以检查如果上传的文件有推而广之正确的类型,所以代码应该是这样的:PHP - 如何确保上传的文件是JPG,GIF或PNG?

if ((($_FILES["photo1"]["type"] == "image/gif") 
|| ($_FILES["photo1"]["type"] == "image/jpeg") 
|| ($_FILES["photo1"]["type"] == "image/png")) 
&& ($_FILES["photo1"]["size"] < 500000)) //also limiting size 

然后在我的代码,下一步我准备作进一步处理的文件。但是如果有人在上传之前将text_file.doc或javascript_file.js更改为samplefile.jpg会怎么样?

move_uploaded_file(($_FILES['photo1']['tmp_name']), "photos/1.jpg"); 
$source1 = imagecreatefromjpeg("../photos/source1.jpg"); 

然后用户将看到错误从imagecreatefromjpeg步:

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg: JPEG 
library reports unrecoverable error: in... 

如何跳过处理的一部分,如果一个文件不是一个图形文件,而不是显示错误?

回答

3

我会用getimagesize并检查可能出现的错误,这样的事情:

try { 
    $size = getimagesize("your_image_file"); 
    echo 'image!'; 
} catch (Exception $e) { 
    echo 'no known image format!'; 
} 

这GD功能并不完美,但它可以与多种图像文件格式处理。

有几种方法可以省略PHP中的警告。如果发生这样的错误,通常会发生。您可以期待它在您的代码中(通常比较可取,请参阅我的示例中的try ... catch)或根据您的需要配置您的环境(p.e. omit warnings)。

+0

我不认为这会正常工作。如果有人将PNG文件重命名为JPG扩展名,'getimagesize'仍然可以返回正确的大小,但imagecreatefromjpeg函数会出错,因为下划线流不是JPEG。 –

+0

海报问_如果文件不是图形文件_如何跳过处理部分,而不是如何验证JPG是否真的是JPG。由于他也期待其他格式,所以他将不得不使用更具创造性的方式来稍后分开处理它们。 – Bjoern

+0

在你的代码之后我应该把行'if $ size!= 0 {//图像处理}'? – Lucas

5

至于书面file-uploads的文件上,更说明$_FILES['userfile']['type']

文件的MIME类型,如果浏览器提供此信息。一个例子就是“image/gif”。然而,这种MIME类型在PHP方面没有被检查,因此不会将其值视为理所当然。

这意味着它不检查在PHP方面,你应该这样做mime_content_type并确认其MIME类型。

或者,您可以使用getimagesize实际检查上传的文件是否具有图片大小,如果不是,则不是图片。

+0

这是不正确的!正如你所说,它基于浏览器的说法,但并不总是正确的(你可以发送应用程序/文字+文档 - 或其他)。因此,您可以将任何名称重命名为其他名称,并提供虚假的MIME类型以使PHP相信任何内容。 – halfdan

1

首先,您应该编辑php.ini以禁用向用户输出警告和错误消息,以便这些用户看不到错误。至少对于生产系统来说,这是推荐的。

然后,你应该能够检查函数的返回值。根据http://de.php.net/manual/en/function.imagecreatefromjpeg.php,如果它不能打开你提供的文件,它应该返回false。

此外,通过异常处理(请参阅http://www.php.net/manual/en/language.exceptions.php),您可以捕获并处理错误消息和警告,如上面发布的错误消息和警告。

相关问题