【问题标题】:CodeIgniter: "The filetype you are attempting to upload is not allowed."CodeIgniter:“您尝试上传的文件类型不允许。”
【发布时间】:2012-04-06 14:19:29
【问题描述】:

我遇到了一个非常奇怪的上传问题。这是相关的视图文件:

<form action="http://localhost/index.php/temp/upload/" method="post" enctype="multipart/form-data">
    <fieldset>
        <input type="file" name="userfile"/>
        <input type="submit" value="Upload"/>
    </fieldset>
</form>

这是我的temp 控制器的upload() 方法:

public function upload()
{
    $config['upload_path']   = FCPATH . 'uploads' . DIRECTORY_SEPARATOR;
    assert(file_exists($config['upload_path']) === TRUE);
    $config['allowed_types'] = 'avi|mpg|mpeg|wmv|jpg';
    $config['max_size']      = '0';

    $this->load->library('upload', $config);
    if ($this->upload->do_upload('userfile') === FALSE)
    {
        // Some error occured
        var_dump($this->upload->display_errors('', ''));
        var_dump($_FILES);
    }
    else
    {
        // Upload successful
        var_dump($this->upload->data());
    }
}

当我上传 AVI 视频时,一切正常。例如,当我上传 WMV 视频时,我得到以下 var 转储:

string 'The filetype you are attempting to upload is not allowed.' (length=57)

array
  'userfile' => 
    array
      'name' => string 'wmv.wmv' (length=7)
      'type' => string 'video/x-ms-wmv' (length=14)
      'tmp_name' => string 'C:\wamp\tmp\php2333.tmp' (length=23)
      'error' => int 0
      'size' => int 83914

“wmv”扩展名被解释为 MIME 类型:video/x-ms-wmv。这应该没问题,因为我的 config/mimes.php 有以下内容:

'wmv' =>  array('video/x-ms-wmv', 'audio/x-ms-wmv')

当我尝试上传其他文件时,情况类似。到目前为止,似乎唯一可行的是我的测试 AVI 视频。

有什么想法可能是错的吗?

更新 1:

一台我的机器,只上传 AVI。在另一个开发者的机器上,没有文件上传。在另一个开发者的机器上,所有支持的文件都上传了。这些是浏览器问题还是服务器问题?

【问题讨论】:

  • 想知道它是否挂在文件名 wmv.wmv 上,试试 diff 文件名。
  • 上传大小限制 (php.ini) 对于其他文件是否设置得太小?

标签: php codeigniter mime-types codeigniter-2


【解决方案1】:

您使用的是 Firefox,不是吗?

您可以尝试查看system/libraries/Upload.php 第 199 行:

$this->_file_mime_type($_FILES[$field]);

将该行更改为:

$this->_file_mime_type($_FILES[$field]); var_dump($this->file_type); die();

然后上传您的.wmv 文件。它会显示类似application/octet-stream 之类的东西。将其添加到您的mimes.php。希望这个帮助=)

类似的答案here

一些链接:

【讨论】:

  • 好的,你的建议奏效了。我更新到 CI 的最新稳定版本,并注意到 mimes.php 不再有 wmv。所以我加回了原始数组 + 应用程序/八位字节流。谢谢!
  • 同意埃里克。必须添加 text/plain 以上传 css 文件。
  • 在 codeigniter3 上转到第 1 行。 454 并添加这一行 var_dump($this->file_type);死();获取文件类型。如果文件类型不在您的 mimes.php 中,请添加它。
  • 我在 localhost 和在线上有相同的安装。我什至尝试了您的方法,并且文件中正确显示了 mime 类型。但是我不能在线上传。上传仅适用于本地主机。顺便说一句,我可以上传图片。但不是 Excel 文件。有什么想法吗?谢谢!
【解决方案2】:

$config["allowed_types"] ="*";

【讨论】:

    【解决方案3】:
    1. 使用 FTP/SFTP/scp/etc 将您的 .wmv 文件上传到运行 CodeIgniter 应用程序的服务器
    2. 在您上传 .wmv 文件的服务器上,执行以下 PHP 代码

      <?php
      $file_path = 'CHANGE_THIS_TO_ABSOLUTE_FILE_PATH_THAT_YOU_HAVE_UPLOADED.wmv';
      $finfo = finfo_open(FILEINFO_MIME);
      $mime = finfo_file($finfo, $file_path);
      var_dump($mime);
      ?>
      
    3. 将代码另存为 mime.php

    4. 在终端运行-$php mime.php
    5. 如果它转储除您已有的 wmv 值之外的任何其他值,请将该值附加到 wmv mime 类型中。

    还要检查其他开发机器中的 PHP_VERSION。 finfo_open 在 PHP 5.3 中引入。上传工作的开发机器可能有旧版本的 PHP,或者它可能有 wmv 的正确 mime 类型。

    【讨论】:

      【解决方案4】:

      您是否尝试在 $config['allowed_types'] 中使用 mime 类型而不是扩展名?

      这样写

      $config["allowed_types"] = "video/x-msvideo|image/jpeg|video/mpeg|video/x-ms-wmv";
      

      【讨论】:

        【解决方案5】:

        在 CodeIgniter 中上传 .doc 文件的答案

        改变这个

        'doc'   =>  'application/msword',
        

        在第 95 行(application/config/mimes.php 文件)

        'doc'   =>  array('application/vnd.ms-word','application/msword'),
        

        【讨论】:

          【解决方案6】:

          我最近在 Codeigniter 的上传类中遇到了一些非常相似的问题。

          *allowed_types* 似乎不起作用。例如,我想允许上传 .PNG 图像,但它不允许它们通过它的过滤器。我最终进一步调查了它。我允许临时上传所有文件类型,我上传了一个 .PNG,然后转储了上传数据 ($this->upload->data());)。由于某种原因,它认为 MIME 类型是 text/plain!这可能与您的问题有关。

          我在一些论坛上找到了一些解决方案,您可以在其中修改/扩展类或核心,但它们对我不起作用——抱歉。我相信这是一个 Codeigniter Core 错误(我认为 EllisLabs 已经解决了这个问题)。无论如何,我最终还是对这该死的东西进行了硬编码!好吧,我希望这对你有所帮助。

          基本示例/解决方法,

          //replace with your allowed MIME types
          if ($_FILES['name_of_form_upload']['type'] != 'image/jpeg' && $_FILES['name_of_form_upload']['type'] != 'image/png' && $_FILES['name_of_form_upload']['type'] != 'image/gif') {
              $data['message'] = '<div class="message">That file type is not allowed!</div>';
              $this->load->view('home_view', $data);
          } else {
              //run upload code
          }
          

          编辑:格式/语法

          【讨论】:

          • 我不认为这是核心问题。在其中一台开发机器上,一切都按预期工作。查看我的编辑。
          【解决方案7】:

          检查应用程序/配置中的 mimes.php 文件。它应该返回一个 mime 类型的数组,例如文件末尾的 return $mimes; 或 mimes 数组开头的 return array(.....

          【讨论】:

            【解决方案8】:

            对于 Codeigniter 3.1.7,如果您通过 $config['file_name'] 提供自定义文件名,请确保文件名也具有文件扩展名。

            【讨论】:

              【解决方案9】:

              这其实是核心的bug。。我升级到最新版本的CI,bug消失了。

              【讨论】:

                【解决方案10】:

                如果您需要简单的方法来解决这个问题,有一个简单的解决方案。 打开“系统/库/Upload.php”文件

                line no 465
                you will see 
                if ( ! $this->is_allowed_filetype())
                        {
                            $this->set_error('upload_invalid_filetype', 'debug');
                            return FALSE;
                        }
                
                
                just make it true
                
                    if ( ! $this->is_allowed_filetype())
                            {
                                $this->set_error('upload_invalid_filetype', 'debug');
                                return TRUE;
                            }
                
                note : it will stop your all file type validation.
                

                【讨论】:

                  【解决方案11】:

                  更改应用程序\config\Mimes.php

                  【讨论】:

                    猜你喜欢
                    • 2017-08-18
                    • 2012-04-22
                    • 1970-01-01
                    • 2011-11-21
                    • 2011-06-08
                    • 2014-12-30
                    • 2023-04-07
                    • 2016-11-14
                    • 1970-01-01
                    相关资源
                    最近更新 更多