[英]File upload mime-type validation with Laravel 4
當我上傳格式良好的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
)
編輯
內置驗證器仍在考慮使用某些mp3作為應用程序/八位字節流,您是否使用此軟件轉換原始文件。
我終於使用了用戶Shane的MimeReader類,它完全有效。 我仍然想知道為什么如此難以檢測到正確的mime類型。
我在Laravel中將其實現為驗證器:
app/libraries/MimeReader.php
移動MimeReader.phps
(觀看擴展名) 擴展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庫中)以及被認為是.oga
audio/ogg
中更正了它。 也許音頻mime類型取決於使用的軟件編碼器。
其他方法是繞過驗證器並使用Input::file('upload')->getMimeType()
直接將mime-type檢查到控制器中,如Sheikh Heera所說。
這可能是因為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
文件,你也可以使用類似於Php PECL擴展id3的庫getID3 ,如果你使用它,你也可以使用文件的ID3 tag
,並且可以獲得title
, artist
, album
, year
, genre
等
如果您使用它,您必須從給定的鏈接( getid3
)手動下載並將其放在app
內的文件夾中,也許是app/libs/
,然后將提取的源中的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);
上面的例子將輸出類似於:
Array
(
[title] => DN-38416
[artist] => Re:\Legion
[album] => Reflections
[year] => 2004
[genre] => 19
)
檢查Php手冊 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.