我收到错误:当我尝试上传任何文件时,不允许您尝试上传的文件类型。
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'),
我花了很长时间才开始这么做,这让我疯了!任何想法都会非常有用。
答案 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扩展名引起的。上传类使用的功能是该扩展的一部分。
答案 7 :(得分:0)
如果您不想更改系统文件。试试这个:
打开system/libraries/Upload.php
(方法do_upload()
第205行)并执行此操作
var_dump($this->file_type);
exit();
尝试上传一些文件。
将您在var_dump()
中看到的文件类型添加到application/config/mimes.php
。
小例子:.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' ) );
} } }