【问题标题】:application/octet-stream mime type issue with codeignitercodeigniter 的应用程序/八位字节流 mime 类型问题
【发布时间】:2012-02-03 09:18:45
【问题描述】:

我对 codeigniter 上传类有一个奇怪的问题。我使用uploadify (http://www.uploadify.com) 添加对文件上传的ajax 支持。当文件从 uploadify 发送到 codeigniter 时,我总是收到一条消息,指出文件类型是不允许的。我做了一些研究,发现问题的原因是uploadify使用的flash。由于某种原因,它总是发送具有 application/octet-stream mime 类型的文件。我尝试上传jpg、png、gif文件类型,但是codeigniter总是显示类型是application/octet-stream。

有谁知道我应该如何在codeigneter中捕获使用flash上​​传的真实文件类型?

【问题讨论】:

    标签: php codeigniter uploadify


    【解决方案1】:

    我找到的唯一解决方案是添加:

    'application/octet-stream'
    

    application/config/mimes.php 文件中找到您需要的各种文件类型。不是特别有用,但它是唯一有效的方法。

    【讨论】:

    • 这种方法有多安全?任何人都可以上传我真正允许的其他类型的文件吗?
    【解决方案2】:

    这里的问题是 CodeIgniter 的上传器似乎有一个小错误,我同意@bearfriend。

    上传库的is_allowed_filetype() 函数允许$ignore_mime 参数,但do_upload 函数中未提供此参数。所以我的解决方案是关闭 mime 检测并(我敢说)修改核心 Upload 类,使文件上传检查如下所示:

    if ( ! $this->is_allowed_filetype($this->detect_mime ? false : true))

    ** 你的 detect_mime 参数的倒数是必需的

    但是(不幸的是)这里还有另一个安全问题。用户可以将virus.exe 重命名为allowed.jpg,该文件仍将被允许。这有多糟糕取决于文件权限以及您使用文件的目的以及文件的使用方式。例如,我在这里尝试了这个想法 (https://www.bleepingcomputer.com/forums/t/573945/this-looks-new-and-slipped-by-the-gmail-filters-this-morning/#entry3687679),但它没有加载,因为它不是有效的图像。不同的操作系统可能不同。

    我的解决方案的另一个问题是,如果您决定升级 CI,这些更改将会丢失(尽管可能会在以后的版本中得到改进)。

    哦,CI 也不会将 $this->file_type 设置为 ignore_mime 为真。如果您在上传后在输出中需要 file_type 的解决方案是使用您自己的变量名(而不是坚持使用 ignore_mime)。

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,我找到的解决方案是创建一个 MY_Upload 库并覆盖设置 file_type (_file_mime_type) 的函数

      class MY_Upload extends CI_Upload {
      
         /**
          * Override application/octet-stream on file_type
          *
          * @param    array   $file
          * @return   void
          */
         protected function _file_mime_type($file) {
             parent::_file_mime_type($file);
      
             if ($this->file_type == 'application/octet-stream' && !empty($file['type'])) {
                 $this->file_type = $file['type'];
             }
      
         }
      
      }
      

      【讨论】:

        【解决方案4】:

        我有同样的问题,并通过设置配置修复它 $config['detect_mime'] = FALSE; 在库中,它的默认值为true。 所以在控制器中调用do_upload()函数之前设置if。 在Upload 类中,它将检查detect_mime 是否为真,并获取文件mime 类型,如果我们将其设置为FALSE,它将不会获取文件mime 类型。 同样在库函数is_allowed_filetype 中有一个参数$ignore_mime 是默认的FALSE,而在do_upload() 函数中它没有被传递。 所以当我们调用这个函数 pass 时,只需在库中做一个 hack !$this->detect_mime
        在这里它只会反转detect_mime,我们可以通过在从任何控制器调用do_upload函数之前设置配置变量来控制是否需要允许mime类型检查。

        如果您发现任何击球手方法,请告诉我。

        【讨论】:

          猜你喜欢
          • 2015-08-11
          • 2011-06-15
          • 2011-10-14
          • 2011-04-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-19
          • 1970-01-01
          相关资源
          最近更新 更多