在Codeigniter中上传 - 不允许您尝试上传的文件类型

时间:2011-09-21 06:26:59

标签: php codeigniter

我收到错误:当我尝试上传任何文件时,不允许您尝试上传的文件类型。

if(!empty($_FILES['proof_of_purchase']['name'])) {
    $config['upload_path'] = './uploads/invoices/';
    $config['allowed_types'] = 'gif|jpg|jpeg|png|pdf|bmp';
    $config['max_size'] = '3000';
    $this->load->library('upload', $config);

      // if there was an error, return and display it
    if (!$this->upload->do_upload('proof_of_purchase'))
    {
        $data['error'] = $this->upload->display_errors();
        $data['include'] = 'pages/classic-register';
    } else {
        $data['upload_data'] = $this->upload->data();
        $filename = $data['upload_data']['file_name'];
    }
}

我尝试了很多不同的文件 - 主要是gif& jpeg并且每次都得到相同的错误。

的var_dump($ _ FILES);给了我:

array(1) { ["proof_of_purchase"]=> array(5) { ["name"]=> string(28) "2010-12-04_00019.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(19) "D:\temp\php2BAE.tmp" ["error"]=> int(0) ["size"]=> int(58054) } } 

我已经检查了mime配置,它包含正确的内容。例如:

'jpeg'  =>  array('image/jpeg', 'image/pjpeg'),
'jpg'   =>  array('image/jpeg', 'image/pjpeg'),
'jpe'   =>  array('image/jpeg', 'image/pjpeg'),

我花了很长时间才开始这么做,这让我疯了!任何想法都会非常有用。

11 个答案:

答案 0 :(得分:25)

如果您使用的是Codeigniter 2.1.0版,则上传库中存在错误。有关详细信息,请参阅http://codeigniter.com/forums/viewthread/204725/

基本上我所做的是修改文件上传类中的几行代码(位置:./ system / library / Upload.php)

1)修改行号1044

从:

$this->file_type = @mime_content_type($file['tmp_name']);
return;

到此:

$this->file_type = @mime_content_type($file['tmp_name']);
if (strlen($this->file_type) > 0) return; 

2)修改行号1058

从:

@exec('file --brief --mime-type ' . escapeshellarg($file['tmp_path']), $output, $return_code);

到此:

@exec('file --brief --mime-type ' . escapeshellarg($file['tmp_name']), $output, $return_code); 

正如您可能看到的那样,第1058行尝试使用不存在的数组值。

答案 1 :(得分:5)

我在CI方面遇到了同样的问题,并且无法在论坛或谷歌上找到解决方法。我所做的是允许所有文件类型,以便上传文件。然后,我手动处理逻辑以确定是允许/保留文件,还是删除它并告诉用户不允许使用文件类型。

$config['upload_path'] = './uploads/invoices/';
$config['allowed_types'] = '*'; // add the asterisk instead of extensions
$config['max_size'] = '3000';
$this->load->library('upload', $config);

if (!$this->upload->do_upload('proof_of_purchase'))
{
    $data['error'] = $this->upload->display_errors();
    $data['include'] = 'pages/classic-register';
} else {
    $data['upload_data'] = $this->upload->data();
    // use custom function to determine if filetype is allowed
    if (allow_file_type($data['upload_data']['file_ext'])) 
    {
        $filename = $data['upload_data']['file_name'];
    }
    else
    {
        show_error('File type is not allowed!');
    }
}

编辑 - 假设您正在使用CI 2(在CI 1中,您可以按照此处的教程允许所有文件类型:http://net.tutsplus.com/tutorials/php/6-codeigniter-hacks-for-the-masters/

答案 2 :(得分:3)

我所做的是创建我自己的库“MY_Upload”来扩展CI_Upload类,然后我只是复制了CI_Upload类,并在我的自定义库中应用了Adam概述的更改(感谢BTW解决方案)。

这允许我使用标准CI语法,并避免黑客攻击原始文件!我的库是自动使用的,因为它只是“扩展”原始版本,它是一个完全无痛的解决方案,如果由于某种原因你必须替换原始文件,它将不会中断。

PS:当我想生成自定义日志时,我也会使用Logging类。

答案 3 :(得分:1)

我有同样的问题。您可能需要检查应用程序是否识别正在上载的文件的mimetype。向config / mimes.php添加新的mimetype修复了该问题。 : - )

答案 4 :(得分:1)

这适用于Codeigniter 2.2版。如果这个问题仍然相关。我在文件系统/ libraries / upload.php文件中跟踪故障,以便在第1032行和第1046行protected function _file_mime_type($file)运行:$this->file_type = $matches[1]; 当我上传扩展名为.txt的文件时,第1046行的语句似乎将'text/x-asm'的错误值分配给$this->file_type,稍后将其与'text/plain'进行比较,因为mime类型不匹配测试失败并发出不适当的文件类型和错误消息:

  

'您尝试上传的文件类型不允许'

解决方案,但不确定,但快速修复似乎有效,将第1032行的条件更改为NOT,使其显示为:if (!function_exists('finfo_file'))而不是:if (function_exists('finfo_file'))。希望这可以帮助别人。

答案 5 :(得分:0)

解决方案是替换CodeIgniter v2.0.3的Upload.php系统/ libraries /中的Upload.php

答案 6 :(得分:0)

此问题是由于没有PHP FileInfo扩展名引起的。上传类使用的功能是该扩展的一部分。

http://www.php.net/manual/en/ref.fileinfo.php

答案 7 :(得分:0)

如果您不想更改系统文件。试试这个:

  1. 打开system/libraries/Upload.php(方法do_upload()第205行)并执行此操作

    var_dump($this->file_type);
    exit();
    
  2. 尝试上传一些文件。

  3. 将您在var_dump()中看到的文件类型添加到application/config/mimes.php

  4. 小例子:.docx有问题。尝试添加:

    'docx' => array('application/zip', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document')
    

    application/config/mimes.php

答案 8 :(得分:0)

我遇到同样的问题,当我尝试上传表单上传时, “.xlsx”文件,在CodeIgniter的mimes.php文件中有一个条目,用于表示“xlsx”文件扩展名。

所以在下面的link中,我已经描述了解决这个问题并找出解决方案的真正需要!

最诚挚的问候,

Randika

答案 9 :(得分:0)

可能值得检查一下你是否有最新版本的application / config / mimes.php而不是设置变量$ mimes它现在只返回一个数组。

new mimes.php

返回数组

mimes.php

$ mimes = array

如果您仍然使用旧版本的mimes.php,则Common.php函数& get_mimes()将返回一个空数组。 这具有破坏Upload.php

的连锁效应

一旦我追踪到这一点,一切正常:)

答案 10 :(得分:0)

1)允许所有文件类型。 2)用传统的php手动设置验证规则以接受或拒绝文件类型。 3)如果遵守验证规则,则使用CI上传帮助程序上传。

if (isset($_FILES['upload_file']) && !empty($_FILES['upload_file'] ['name'])) {
        $file_name=$_FILES['upload_file'] ['name'];
        $acceptedext=array("zip","pdf","png","jpg","jpeg");
        $a=(explode('.', $file_name));
        $b=end($a);
        $file_ext=strtolower($b);

        if (!in_array($file_ext, $acceptedext)) {
            $this->session->set_flashdata( 'flash_message_error', "file format not accepted!" );
            redirect( base_url( 'page' ) );
        }
        else{
            $config['upload_path'] = './uploads/';
            $config['allowed_types'] = '*';


            $this->load->library('upload');
            $this->upload->initialize($config);

            if (!$this->upload->do_upload('upload_file')) {

                $error = $this->upload->display_errors('', ' ');
                $this->session->set_flashdata( 'flash_message_error', $error );
                redirect( base_url( 'page' ) );
            } } }