php - 使用 Laravel 4 进行文件上传 mime 类型验证

标签 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)

最佳答案

编辑

内置验证器仍在将某些 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 库中)以及被视为 .ogaaudio/ogg 中更正了它。也许音频 mime 类型取决于所使用的软件编码器。

其他方法是绕过验证器并使用 Input::file('upload')->getMimeType() 将 mime 类型直接检查到 Controller 中,如 Sheikh Heera 所说。

关于php - 使用 Laravel 4 进行文件上传 mime 类型验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21564029/

相关文章:

javascript - 将 Laravel 变量传递给 Vue.js

Laravel Lighthouse 分页字段结果

php - symfony2-创建 native 查询时如何一次添加所有字段结果

php - 如何保护电话号码免受机器人攻击

php - Facebook SDK 错误 : Cross-site request forgery validation failed. 所需参数 "state"从持久数据中丢失

java - 无法在jsp中下载.xlsx文件

symfony - 创建自定义目录命名器的简单示例

php - Laravel Eloquent - 混合了 snake_case 和 camelCase 列的现有数据库

php - 执行插入查询后如何在 php 页面中添加产品

node.js - 当内容类型为 application/octet-stream 时 Restify 获取 request.body