CodeIgniter:“不允许您尝试上传的文件类型。”

时间:2012-03-22 01:22:19

标签: php codeigniter mime-types codeigniter-2

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

<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上传。在另一个开发人员的机器上,没有文件上传。在另一台开发人员的计算机上,所有支持的文件都会上传。这些是浏览器还是服务器问题?

11 个答案:

答案 0 :(得分:50)

您正在使用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

一些链接:

答案 1 :(得分:5)

$ config [“allowed_types”] =“*”;

答案 2 :(得分:4)

  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类型中。
  6. 另请检查其他开发计算机中的PHP_VERSION。 finfo_open在PHP 5.3中引入。上传工作的开发机器可能有旧版本的PHP,或者它可能具有适用于wmv的mime类型。

答案 3 :(得分:2)

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

像这样写

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

答案 4 :(得分:1)

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

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

有一些解决方案,我发现冲浪一些论坛,你可以修改/扩展课程或核心,但他们不适合我 - 抱歉。我相信这是一个Codeigniter核心错误(我认为问题已经在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
}

编辑:格式/语法

答案 5 :(得分:1)

在CodeIgniter

中回答上传.doc文件

更改此

'doc'   =>  'application/msword',

使用此行号95(application/config/mimes.php文件)

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

这实际上是核心中的一个错误..我升级到CI的最新版本,错误消失了。

答案 8 :(得分:0)

如果你需要简单的方法来解决这个问题,那么就有一个简单的解决方案。     打开“system / libraries / 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.

答案 9 :(得分:0)

更改IN application \ config \ Mimes.php

答案 10 :(得分:0)

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