【问题标题】:Uploading in Codeigniter - The filetype you are attempting to upload is not allowed在 Codeigniter 中上传 - 不允许您尝试上传的文件类型
【发布时间】:2011-11-21 15:56:24
【问题描述】:

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

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

【问题讨论】:

  • 尝试使用$this->upload->data()检查CodeIgniter读取的dile信息,您可能会在那里找到一些线索。
  • 我觉得还可以吗? - array(14) { ["file_name"]=> string(15) "minifur-hs1.jpg" ["file_type"]=> string(10) "image/jpeg" ["file_path"]=> string(32) "D:/www/website/uploads/invoices/" ["full_path"]=> string(47) "D:/www/website/uploads/invoices/minifur-hs1.jpg" ["raw_name"]=> string(11) "minifur-hs1" ["orig_name"]=> string(0) "" ["client_name"]=> string(15) "minifur-hs1.jpg" ["file_ext"]=> string(4) ".jpg" ["file_size"]=> int(18168) ["is_image"]=> bool(true) ["image_width"]=> string(0) "" ["image_height"]=> string(0) "" ["image_type"]=> string(0) "" ["image_size_str"]=> string(0) "" }
  • 我也遇到了这个问题。使用“。”时出现错误。在表单的另一个字段中,但只要我不使用“。”,它似乎工作正常。很奇怪。
  • +1 我一直遇到这个问题。有时有效,有时无效。
  • @dangermark -- Web 服务器运行 PHP v5.2 的可能性有多大?升级到最新的 CodeIgniter 后,我遇到了同样的问题,这对我来说是个问题。降级到 CodeIgniter v2.0.3 解决了它。

标签: php codeigniter


【解决方案1】:

我在使用 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/

【讨论】:

  • 在我找到可行的方法之前,这是目前唯一适用于我的解决方案。尝试修改 config/mimes.php 和 system/libraries/Upload.php,无济于事。我想我可以对文件类型进行后处理以确保它们是合法类型。
【解决方案2】:

如果您使用的是 Codeigniter 2.1.0 版,则上传库中存在错误。详情请见http://codeigniter.com/forums/viewthread/204725/

我所做的基本上是修改文件上传类中的几行代码(位置:./system/libraries/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 行尝试使用不存在的数组值。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。您可能需要检查应用程序是否识别正在上传的文件的 mimetype。向 config/mimes.php 添加一个新的 mimetype 解决了这个问题。 :-)

    【讨论】:

      【解决方案4】:

      解决方法是将system/libraries/中的Upload.php替换为CodeIgniter v2.0.3的Upload.php

      【讨论】:

        【解决方案5】:

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

        这让我可以使用标准的 CI 语法,并避免破解原始文件!我的库被自动使用,因为它只是“扩展”了原始文件,这是一个完全无痛的解决方案,如果由于某种原因您必须替换原始文件,它也不会中断。

        PS:当我想生成自定义日志时,我也使用 Logging 类执行此操作。

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • 我刚刚在我的 CPanel 中找到了该扩展程序,并启用了它。尝试上传.png时仍然遇到“您尝试上传的文件类型不允许”的问题。
          【解决方案7】:

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

          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

          【讨论】:

            【解决方案8】:

            这适用于 Codeigniter 2.2 版。如果这个问题仍然相关。我在文件 system/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'))。希望这可以帮助某人。

            【讨论】:

              【解决方案9】:

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

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

              【讨论】:

                【解决方案10】:

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

                mimes.php

                返回数组

                mimes.php

                $mimes = 数组

                如果您还有旧版本的 mimes.php,Common.php 函数 &get_mimes() 返回一个空数组。 这具有破坏 Upload.php 的连锁反应

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

                【讨论】:

                  【解决方案11】:

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

                  【讨论】:

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