gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:54:58 26 4
gpt4 key购买 nike

当我上传一个格式正确的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com