1

我在 PHP 中有一个文件(图像)上传脚本,用于上传和调整图像大小......它使用简单的 MIME 类型和大小验证,因此只允许 jpg 图像和 1MB 最大文件大小。

我最近发现了一个问题。当我尝试使用脚本上传 .avi 文件时,脚本会像处理正确的 MIME 类型和大小一样处理文件,然后什么也不做,只是将我带回上传表单而没有任何错误消息。(而不是显示“文件太大”消息)。

我的意思是,如果我尝试上传 .gif 或 .txt 或其他内容,我会得到一个错误,正如预期的那样。如果我尝试上传任何大于 1MB 的文件,我会得到一个错误,正如预期的那样。只有当我尝试上传超过 1MB 的 .avi 文件时,我才没有收到任何错误......好吧,这里是代码的第一部分:

// define a constant for the maximum upload size
define ('MAX_FILE_SIZE', 1024000);

if (array_key_exists('upload', $_POST)) {
// define constant for upload folder
define('UPLOAD_DIR', 'C:/Wamp/www/Version-1.4/posters_uploaded/');

// replace any spaces in original filename with underscores. At the same time, assign to a simpler variable
$file = str_replace(' ', '_', $_FILES['image']['name']);

// convert the maximum size to KB
$max = number_format(MAX_FILE_SIZE/1024, 1).'kb';
// create an array of permitted MIME types
$permitted = array('image/jpeg','image/pjpeg');
// begin by assuming the file is unacceptable
$sizeOK = false;
$typeOK = false;

// check that file is within the permitted size
if ($_FILES['image']['size'] > 0 && $_FILES['image']['size'] <= MAX_FILE_SIZE) {
    $sizeOK = true;
}
// check that file is of a permitted MIME type
foreach ($permitted as $type) {
    if ($type == $_FILES['image']['type']) {
        $typeOK = true;
    break;
    }
}

if ($sizeOK && $typeOK) {
    switch($_FILES['image']['error']) {
        case 0: // ...................

我只是在修改构建 PHP 代码,所以我不是专家......有什么建议吗?谢谢。

4

7 回答 7

2

http://us3.php.net/manual/en/features.file-upload.common-pitfalls.php

看起来你的upload_max_filesizeini设置太低了。当您上传非常大的文件(例如 AVI 视频)时,这不会导致显示错误。

您看到文本文件和 .jpg 图像错误的原因可能是因为这些文件的大小大于 1 MB,但低于您upload_max_filesizephp.ini中的设置。

如果您无法直接访问php.ini文件,请尝试echo获取 的值并查看该值是什么。ini_get("max_upload_filesize")

于 2009-03-30T16:13:01.740 回答
0

在这条线之上:

if ($_FILES['image']['size'] > 0 && $_FILES['image']['size'] <= MAX_FILE_SIZE) {
        $sizeOK = true;
}

把这个:

echo '<pre>' . printr($_FILES) . </pre>;

这将向您显示 FILES 数组中的内容,并且应该使调试变得非常简单。尝试上传 AVI 并将上述行添加到您的脚本中。

于 2009-03-30T16:15:15.853 回答
0

我还建议您不要相信哑剧类型。有时人们将 .png 或 .gif 文件重命名为 .jpg,或者他们可能故意上传不正确的文件。使用 getimagesize 检查这些是否是有效的 jpeg 图像。

于 2009-03-30T16:29:36.070 回答
0

正如上面提到的 john Rasch,任何高于 php.ini max_upload_filesize 的文件都不会被处理。所以你将没有机会为你测试错误。您必须假设它没有上传并验证它是否是。


既然我更好地了解了您的情况,我认为您可以这样做:

// at the top of your script
$upload_success = FALSE;


// when successfully detected upload
$upload_success = TRUE;



// if successful upload code is never run
$display_error = "File not uploaded, may be too large a file, "
.    "please upload less than 1MB"
;
print $display_error;

要点是:

您不能总是检测到太大的上传文件,因为它们在比脚本运行位置更深的级别被切断。

于 2009-03-30T16:51:45.720 回答
0

不要忘记,在上传文件时,在 php.ini 中实际上需要注意两个指令。一个是upload_max_filesize,另一个是post_max_size。通常,post_max_size 至少应该等于并且可能大于upload_max_filesize。无论您设置什么upload_max_filesize,您都不能上传大于post_max_size 的文件。

AVI 文件与您在允许的数组中列出的 mime 类型不匹配。完成 $sizeOK 和 $typeOK 检查后,检查它们保存的值以及脚本如何处理这些值。这可能是脚本行为的关键。

于 2009-03-30T22:16:10.497 回答
0

使用 $_FILES['image']['type'] 检查 MIME 是不可靠的,它是基于客户端的标头,可以被欺骗。查看 fileinfo 扩展名以根据实际内容检查 MIME。

于 2011-03-06T07:37:29.747 回答
0

八年后,对于像我这样的任何人来说,在上传之前用 PHP 检查图像 MIME 类型的答案都跌跌撞撞的简短回答:

if (exif_imagetype($file['tmp_name']) != IMAGETYPE_JPEG) {
    $file['error'] = 'Your picture must be jpg.';
}

来自手册: http: //php.net/manual/en/function.exif-imagetype.php

于 2017-03-03T21:22:14.237 回答