当我上传格式正确的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
添加到表单声明中)
答案 0 :(得分:11)
修改强>
内置验证器仍在考虑使用某些mp3作为应用程序/八位字节流,您是否使用此软件转换原始文件。
我最终使用了用户MimeReader的Shane类,这完全有效。我仍然想知道为什么要检测一个正确的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
告知为通用/后备类型。您可以尝试使用此规则(下面给出的示例)(未经过测试/确定),因为根据rfc3003,audio/mpeg
是mp3
的正确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
该文件可以获取title
,artist
,album
,year
,genre
等信息。
如果您使用它,则必须从给定链接(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。