我设置了一个验证器,以检查我们上传的文档是否为XML文件
if ($request->input('action') == 'upload_document') {
$validator = Validator::make($request->all(), [
'file' => 'bail|required|mimes:application/xml,xml|max:10000',
]
);
}
但是,当我上传时,即使我删除扩展名为.xml的真实XML文件,此验证器也会触发错误“文件必须为application / xml,xml类型”。
我当然在我的php.ini配置扩展名= php_fileinfo.dll中
答案 0 :(得分:1)
请注意,mime类型验证会指示Laravel读取文件内容以确定其类型,因此将图像扩展名从.jpg
更改为.xml
不会欺骗
从Docs
哑剧: foo,bar ,...
正在验证的文件必须具有与列出的扩展名之一相对应的MIME类型。
'photo' => 'mimes:jpeg,bmp,png'
即使您只需要指定扩展名,该规则也会通过读取文件的内容并猜测其MIME类型来针对文件的MIME类型进行验证。
可以在以下位置找到MIME类型及其相应扩展名的完整列表:https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
因此请确保您的文件是Laravel项目中的实际有效xml文件(使用phpunit.xml进行尝试)
Route::post('/', function (Request $request) {
if ($request->input('action') == 'upload_document') {
$validator = Validator::make(
$request->all(),
[
'file' => 'bail|required|mimes:application/xml,xml|max:10000',
]
);
$validator->validate();
dd('the file is valid');
}
});
还有这样的形式
<form method="post" enctype="multipart/form-data">
@csrf
<input name="action" value="upload_document">
<input type="file" name="file">
<button type="submit">Submit</button>
</form>
@error('file')
{{ $message }}
@enderror
结果:
"the file is valid"
但是在使用image.xml
The file must be a file of type: application/xml, xml.
Route::post('/', function (Request $request) {
if ($request->input('action') == 'upload_document') {
$request->validate([
'file' => [
'bail',
'required',
'max:10000',
function ($attribute, $value, $fail) {
if ($value->getClientMimeType() !== 'text/xml') {
$fail($attribute.'\'s extension is invalid.');
}
},
]
]);
dd('the file is valid');
}
});
现在扩展名为xml
的图像文件通过了验证
答案 1 :(得分:0)
外部公司提供的XML似乎不符合适当的XML标准。
由于它不在我手上,因此我不会重新格式化它,而只能将其作为文本进行管理。所以我想我不能在我的情况下使用验证器。
答案 2 :(得分:0)
对于那些试图在Laravel 5上传递xml扩展名的人(像我一样)。 这也可以与其他扩展一起使用。
由于Laravel ExtensionGuesser允许通过方法寄存器添加自定义猜测器,因此我们进行以下操作。
<?php
namespace App\Helpers;
use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeExtensionGuesser;
/**
* Provides a best-guess mapping of mime type to file extension.
*/
class PriorExtensionGuesser extends MimeTypeExtensionGuesser
{
/**
* Addition to pretty old map of mime types and their default extensions.
*
* @see http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
*/
protected $defaultExtensions = array(
'text/xml' => 'xml',
);
}
use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser;
public function store (Request $request) {
if ($request->hasFile('file')) {
$guesser = ExtensionGuesser::getInstance(); //take the guesser who will guess
$guesser->register(new \App\Helpers\PriorExtensionGuesser()); //add own guesser
$validator = Validator::make($request->all(), [
'file' => 'file|mimes:txt,xls,xlsx,csv,xml|max:32768',
]);
if ($validator->fails()) {
.....
因此,现在猜测者检查Prior *类中的数组,然后返回原始数组。