使用Laravel 4文件上传mime类型验证

时间:2014-02-04 21:38:41

标签: php file-upload laravel laravel-4 mime-types

当我上传格式正确的MP3文件时,Laravel 4告诉我它不是audio/mp3而是application/octet-stream,这使得此验证失败:

$validator = Validator::make(
    array('trackfile' => Input::file('trackfile')), 
    array('trackfile' => 'required|mimes:mp3')
);

if($validator->fails())
    return 'doesn\'t works because mime type is '.Input::file('trackfile')->getMimeType();
else
    return 'it works!';

为什么不将文件上传为audio/mp3文件?

(我已将'files' => true添加到表单声明中)

2 个答案:

答案 0 :(得分:11)

修改

内置验证器仍在考虑使用某些mp3作为应用程序/八位字节流,您是否使用此软件转换原始文件。

我最终使用了用户MimeReaderShane类,这完全有效。我仍然想知道为什么要检测一个正确的mime类型是如此困难。

我在Laravel中将其实现为验证器:

  • MimeReader.phps中移动app/libraries/MimeReader.php(观看扩展程序)
  • 扩展Laravel Validator(我把它放在我的BaseController构造函数中)

    Validator::extend('audio', function($attribute, $value, $parameters)
    {
        $allowed = array('audio/mpeg', 'application/ogg', 'audio/wave', 'audio/aiff');
        $mime = new MimeReader($value->getRealPath());
        return in_array($mime->get_type(), $allowed);
    });
    
  • app/lang/[whatever]/validation.php中添加您的错误消息(在我的情况下,密钥为audio
  • 我现在可以使用audio作为规则!示例:'file' => 'required|audio',其中file表示Input::file('file')

Laravel正在考虑将audio/mpeg个文件视为.mpga而不是.mp3。我在MimeTypeExtensionGuesser.php(在Symfony库中)以及被认为是audio/ogg的{​​{1}}更正了它。也许音频mime类型取决于使用的软件编码器。

其他方法是绕过验证器,并使用像Sheikh Heera所说的.oga将mime-type直接检入控制器。

答案 1 :(得分:5)

可能是因为mp3文件的mime类型为audio/mpeg,或者可能是因为它无法识别mime_content_type并将application/octet-stream告知为通用/后备类型。您可以尝试使用此规则(下面给出的示例)(未经过测试/确定),因为根据rfc3003audio/mpegmp3的正确mime类型:

array('trackfile' => 'required|mimes:audio/mpeg,mp3')

此外,您可以使用以下内容手动检查mime类型:

$file = Input::file('upload');
if($file->getMimeType() == 'audio/mpeg') {
    // valid
}
else {
    // invalid
}

<强>更新

特别是,对于mp3个文件,您还可以使用类似于getID3的库Php PECL extension id3,如果您使用它,您还可以使用ID3 tag该文件可以获取titleartistalbumyeargenre等信息。

如果您使用它,则必须从给定链接(getid3)手动下载并将其放在app内的文件夹中,可能app/libs/并放置{{ 1}}从提取的源到getid3文件夹的文件夹,然后在libs文件中,在composer.json部分的classmap内添加一个条目,如:

autoload

然后从终端/命令提示符运行// ... "app/tests/TestCase.php", "app/libs/getid3" ,您就可以使用它了。要使用它,请尝试:

composer dump-autoload

对于有效的$file = Input::file('upload'); // assumed name of the file input is upload $path = $path = $file->getRealPath(); $id3 = new getID3(); $tags = $id3->analyze($path); if(is_array($tags) && array_key_exists('audio', $tags)) { // valid dd($tag['tags']); } 文件,您将获得如下数组:

mp3

如果您已经安装或可以使用(来自终端)以下命令安装array (size=2) 'id3v1' => array (size=6) 'title' => array (size=1) 0 => string '46. Piya Basanti' (length=16) 'artist' => array (size=1) 0 => string '(Freshmaza.com)' (length=15) 'album' => ... 扩展名:

PECL

然后你通常可以使用

pear install pecl/id3

以上示例将输出类似于:

的内容
$tags = id3_get_tag( "path/to/example.mp3" );
print_r($tag);

检查Php manual