如何使 CodeIgniter 文件上传类接受所有扩展?

Posted

技术标签:

【中文标题】如何使 CodeIgniter 文件上传类接受所有扩展?【英文标题】:How to make CodeIgniter file upload class accept all extensions? 【发布时间】:2010-11-01 09:03:27 【问题描述】:

目前,如果我不为该类提供扩展,则它不允许扩展。我想允许所有扩展。有什么方法可以在不破解内核的情况下做到这一点?

【问题讨论】:

【参考方案1】:

在 Codeigniter 2 中,您只需要像这样定义允许的类型:

$config['allowed_types'] = '*';

【讨论】:

也适用于 CodeIgniter 3【参考方案2】:

我做的是:

$ext=preg_replace("/.*\.([^.]+)$/","\\1", $_FILES['userfile']['name']);
$fileType=$_FILES['userfile']['type'];
$config['allowed_types'] = $ext.'|'.$fileType;

这使得每个函数调用中的所有文件都自动被允许。

【讨论】:

【参考方案3】:

您直接问题的答案:不,如果不覆盖核心,就无法做到这一点

好消息是你可以避免破解内核,per the manual

作为额外的奖励,CodeIgniter 允许您的库扩展 如果您只需要添加一些功能到本机类 现有的图书馆。或者你甚至可以替换本地库 通过将同名版本放置在您的应用程序/库文件夹中。

因此,要替换您的库,您可以将 Upload.php 复制到您的

application/libraries

文件夹,然后将您的自定义逻辑添加到该 Upload.php 文件。每当您加载上传库时,Code Igniter 都会包含此文件。

或者,您可以创建自己的 OWN 自定义上传器类来扩展原始文件,并且只改进 is_allowed_filetype 函数。

application/libraries/MY_Upload.php
class MY_Upload Extends CI_Upload
    function is_allowed_filetype()
         //my custom code here
    

每当您升级时,您都需要阅读the changelog,但这将允许您将您的代码和核心代码保存在不同的宇宙中。

【讨论】:

Alan 的 magento 编码进展如何?【参考方案4】:

到目前为止,它似乎只能通过黑客来实现。

我在 system/libraries/Upload.php 的第 556 行插入了 return true

【讨论】:

我更喜欢制作自定义库而不是编辑 system/libraries/ 文件夹。在 CI 上更新到新版本通常意味着用最新版本替换旧的 system/ 文件夹(system/application/ 除外)。 CMIIW【参考方案5】:

$config['allowed_types'] = '*'; 它将上传任何文件格式,如 .exe 或 .jpegs 额外...

【讨论】:

【参考方案6】:

如果一切都不起作用,则重新排列允许的类型顺序,如第一个视频格式中的那样

$config['allowed_types'] = 'mp4|jpg|png|'

它适用于我的情况,所以我分享了如果可能的话尝试一下。

【讨论】:

【参考方案7】:

你只需要替换这个条件:

        if (! $this->is_allowed_filetype())
        
            $this->set_error('upload_invalid_filetype');
            return false;
        

与:

        if (count($this->allowed_types) && !$this->is_allowed_filetype())
        
            $this->set_error('upload_invalid_filetype');
            return false;
        

【讨论】:

【参考方案8】:

$config['allowed_types'] = '*'; 是可能的解决方案,但恕我直言,它不是很安全。更好的方法是在$config['allowed_types'] 中添加你需要的文件类型。如果 CodeIgniter 没有您需要的 MIME 类型,您可以通过在“application/config”文件夹中编辑文件 mimes.php 来添加它们。只需将您的 mime 类型包含在数组中即可。

添加 epub 和 fb2 文件类型的示例:

return array(
'epub'  =>  'application/epub+zip',
'fb2'   =>  'application/x-fictionbook+xml',
'hqx'   =>  array('application/mac-binhex40', 'application/mac-binhex', 'application/x-binhex40', 'application/x-mac-binhex40'),

然后你就可以使用你在$config['allowed_types']变量中添加的扩展了。

【讨论】:

以上是关于如何使 CodeIgniter 文件上传类接受所有扩展?的主要内容,如果未能解决你的问题,请参考以下文章

如何在codeigniter中获取上传文件的完整路径?

如何将文件codeigniter上传到数据库

codeigniter 文件上传 - 可选?

如何将图像路径和名称上传到数据库 - Codeigniter

如何在codeigniter中使用ajax上传图片?

CodeIgniter - 表单验证和文件上传数据