簡體   English   中英

使用Laravel 4文件上傳mime類型驗證

[英]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作為應用程序/八位字節流,您是否使用此軟件轉換原始文件。

我終於使用了用戶ShaneMimeReader類,它完全有效。 我仍然想知道為什么如此難以檢測到正確的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告知為通用/后備類型。 您可以嘗試此規則(下面給出的示例)(未測試/確定),因為根據rfc3003audio/mpegmp3的正確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 ,並且可以獲得titleartistalbumyeargenre

如果您使用它,您必須從給定的鏈接( getid3 )手動下載並將其放在app內的文件夾中,也許是app/libs/ ,然后將提取的源中的getid3文件夾放入libs文件夾,然后放入composer.json文件里面添加一個條目classmapautoload狀部分:

// ...
"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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM