php_fileinfo扩展不适用于在线laravel 4

时间:2014-08-19 21:56:53

标签: php file-upload laravel laravel-4

您正在开发具有文件上传字段格式的laravel中的应用程序。它在本地系统中完美运行。但是当我在网上上传并提交表单时,它会显示此错误

Unable to guess the mime type as no guessers are available 
(Did you enable the    php_fileinfo extension?)

当表单提交时,我正在检查文件上传的扩展名。

Input::file('logo')->getClientOriginalExtension();

我跳'php_fileinfo'扩展名用于获取此文件扩展名。

请告诉我该怎么做才能克服这个错误或者有其他方法

1 个答案:

答案 0 :(得分:1)

我处于类似的情况,这是我如何解决它。

  

警告: Laravel使用php_fileinfo的原因是因为它遵循永远不应该信任客户端的原则 - 也就是说,盲目信任MIME类型存在风险客户提供的。

如果您愿意忽略这种风险,这里有一个简单的解决方法,特别是如果您只需要处理一次上传

实现您自己的MimeTypeGuesserInterface

这是Symfony(构建Laravel)用于检测文件MIME类型的接口。此接口的一个关键限制是仅提供(临时)文件的路径来猜测其类型。这意味着,当您到达此处时,客户端提供的MIME类型将消失。

class StupidMimetypeGuesser implements
    Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface
{
    protected $type = null;

    public function __construct($stupidType) {
        $this->type = $stupidType;
    }

    public function guess($path) {
        return $this->type;
    }
}

在POST处理程序中,手动提取客户端提供的MIME类型

// This will only work for a single upload. You can implement a fancier guesser to handle multiple files
$attachment = Input::file('attachment');
$clientMime = $attachment->getClientMimeType();

MimeTypeGuesser::getInstance()->register(new StupidMimetypeGuesser($clientMime));

现在Input::file('x')->getMimeType()将使用客户端提供的MIME类型。