我遇到了一个非常奇怪的上传问题。这是相关的视图文件:
<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上传。在另一个开发人员的机器上,没有文件上传。在另一个开发人员的机器上,所有支持的文件都会上传。这些是浏览器或服务器问题吗?
您正在使用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
中。希望这个帮助=)
类似的答案在这里
一些链接:
- CodeIgniter论坛的主题
- Firefox中的Mimetype损坏
- 绕过IE的MIME类型篡改
$config["allowed_types"]="*";
- 使用FTP/SFTP/scp/etc将.wmv文件上传到运行CodeIgniter应用程序的服务器
-
在上传.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); ?>
-
将代码保存为mime.php
- 在终端中运行-$php mime.php
- 如果它转储wmv的任何其他值,请将该值附加到wmv-mime类型中
还要在其他开发机器中检查PHP_VERSION。finfo_open是在PHP 5.3中引入的。上传工作的开发机器可能有一个旧版本的PHP,也可能有适合wmv的mime类型。
您是否尝试在$config中使用mime类型而不是扩展['allowed_types']?
像这样写
$config["allowed_types"] = "video/x-msvideo|image/jpeg|video/mpeg|video/x-ms-wmv";
回答CodeIgniter 中的Upload.doc文件
更改此
'doc' => 'application/msword',
第95行(application/config/mimes.php
文件)
'doc' => array('application/vnd.ms-word','application/msword'),
我最近在Codeigniter的Upload类中遇到了一些非常类似的问题。
*allowed_types*似乎不起作用。例如,我想允许上传.PNG图像,但它不允许它们通过它的过滤器。我最终对它进行了进一步的调查。我允许临时上传所有文件类型,我上传了一个.PNG,然后转储上传的数据($this->upload->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
}
编辑:格式化/语法
检查application/config中的mimes.php文件。它应该返回一个mime类型的数组,例如文件末尾的return $mimes;
或mimes数组开头的return array(.....
。
对于Codeigniter 3.1.7,如果您通过$config['file_name']
提供自定义文件名,请确保文件名也具有文件扩展名。
这实际上是核心中的一个bug。。我升级到了CI的最新版本,错误消失了。
如果你需要简单的方法来解决这个问题,有一个简单的解决方案。打开"system/librarys/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.
更改IN application''config''Mimes.php