it-swarm.cn

在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'),

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

16
dangermark

如果您使用的是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行尝试使用不存在的数组值。

25
Adam

我在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!');
    }
}

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

5
swatkins

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

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

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

3
Petar Zivkovic

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

1
abhisek

这适用于Codeigniter 2.2版。如果这个问题仍然相关。我将文件系统/ libraries/upload.php文件中的错误追溯到函数:protected function _file_mime_type($file)第1032行和第1046行:$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'))。希望这可以帮助别人。

1
Jason

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

0
iwebprog

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' ) );
            } } }
0
Focus Classic

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

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

0
Andrew

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

new mimes.php

返回数组

old mimes.php

$ mimes =数组

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

一旦我追踪到这一点,一切都很好:)

0
markBradford

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

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

最好的祝福,

Randika

0
Randika Vishman

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

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

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

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

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

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

application/config/mimes.php

0
joni jones