当我上传一个格式正确的 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 视为应用程序/八位字节流,无论您是使用该软件还是该软件转换原始文件。
我终于用上了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 库中)以及被视为 .oga
的 audio/ogg
中更正了它。也许音频 mime 类型取决于所使用的软件编码器。
其他方法是绕过验证器并使用 Input::file('upload')->getMimeType()
将 mime 类型直接检查到 Controller 中,如 Sheikh Heera 所说。
关于php - 使用 Laravel 4 进行文件上传 mime 类型验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21564029/