Laravel-更改请求对象上文件的mime类型



我正在上传一个扩展名为dwf的文件。

然而,执行$request->file('dwf_file')->extension()时,给我bin而不是dwf,并且文件上的mime类型被错误地设置为application/octet-stream,这可能是它猜测它是二进制文件的原因。

现在,在验证开始之前,我正在尝试动态更改mime类型:

$file = $request->file('dwf_file');
$request->merge([
'dwf_file' =>
new IlluminateHttpUploadedFile(
$file->getPath(),
$file->getClientOriginalName(),
'model/vnd.dwf' // correct mime-type
)
]);
$request->validate(...); // fails because uploaded file's extension is not dwf

它不起作用,我认为主要是因为merge只处理输入源,而不处理文件。

那么,如何将dwf_file更改为UploadedFile的新实例?或者我可以更改现有UploadedFile实例上的mime类型吗?我在这个类上找不到任何setMimeType方法。

我有什么选择?

谢谢。

您可以使用getClientOriginalExtension。它将返回dwf extension

$request->file('dwf_file')->getClientOriginalExtension()

并且$request->file('dwf_file')->extension()将返回bin

您可以使用获得mimeType

$request->file('dwf_file')->getMimeType() or getClientMimeType()

这将返回"application/octet-stream"

形式

<form method="POST" enctype="multipart/form-data">

作为旁注

getClientOriginalExtension((

返回原始文件扩展名。它是从上传的原始文件名中提取的。那么它就不应该被认为是一个安全值。

更新

我认为dwf扩展无法正常用于mimes验证。因为上传的dwf文件以mimes的形式返回bin。因此,更好地创建自定义验证

'dwf_file' => ['file','mimeTypes:application/octet-stream', function ($attribute, $value, $fail) {
if ($value->getClientOriginalExtension() != 'dwf') {
$fail('The '.$attribute.' is invalid.');
}
}],

最新更新