【问题标题】:PHP upload code problem with permitted MIME file types允许的 MIME 文件类型的 PHP 上传代码问题
【发布时间】:2010-10-16 10:04:03
【问题描述】:

我在 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 代码,所以我不是专家... 有什么建议?? 谢谢。

【问题讨论】:

  • 如果您发布 avi 的文件大小会有所帮助
  • 不相关..我尝试了不同的文件..在 400MB 和 800MB 之间。

标签: php image-processing image-manipulation file-upload


【解决方案1】:

八年后,对于像我这样的任何人来说,在上传前用 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      在这条线上:

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

      把这个:

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

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

      【讨论】:

      • 应该是 print_r($_FILES),而不是 printr($FILES)。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        正如上面提到的 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;
        

        重点是:

        您无法始终检测到太大的上传文件,因为它们在比脚本运行位置更深的级别被截断。

        【讨论】:

        • 检查了 php.ini... 我有 2MB 限制... ;上传文件的最大允许大小。 upload_max_filesize = 2M 所以,这不是问题......
        • ?我认为你只是证明了这就是问题所在。除非您的 avi 介于 1 到 2mb 之间,我怀疑大多数 avi 文件都远高于 2mb,我们有一个 flash 视频上传器,并且最大设置为 18
        • 是的,我的 avi 文件是 600MB,我不想允许上传.. 我想要 1MB 的限制.. 如果我只想要 1MB 的限制,为什么我需要设置更大的最大值?
        • 如果超过 2MB php.ini 限制,PHP 脚本甚至可能检测不到文件已上传,因为它在服务器级别被 php.ini 中的 max_upload_file_size 截断
        【解决方案6】:

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

        【讨论】:

        • 我测试过的浏览器似乎设置了mime类型,它是基于文件扩展名的。他们没有对图像格式进行真正的测试,这太复杂了。相信我,我已经用 PHP 从头开始​​构建了图像上传系统。
        【解决方案7】:

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

        您的upload_max_filesize ini 设置似乎太低了。当您上传非常大的文件(例如 AVI 视频)时,这不会导致显示错误。

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

        如果您无法直接访问 php.ini 文件,请尝试echoini_get("max_upload_filesize") 的值并查看其值。

        【讨论】:

        • 检查了 php.ini... 我有 2MB 限制... ;上传文件的最大允许大小。 upload_max_filesize = 2M 所以,这不是问题......
        • 最大大小为 2 GB,是这个意思吗?
        • 我不想允许大于 1 MB 的文件。为什么我需要更改我的 2MB 限制???
        • 由于您的设置为 2MB,PHP 将完全忽略任何上传大于 2MB 的内容的尝试,这就是您根本看不到错误消息的原因 - 因为当您提交表单时没有任何反应文件大于 2MB 设置。
        猜你喜欢
        • 2015-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-26
        • 2016-03-03
        • 1970-01-01
        • 1970-01-01
        • 2011-06-09
        相关资源
        最近更新 更多