【发布时间】:2018-06-03 06:53:09
【问题描述】:
我正在尝试上传 CSV 文件,并且我想在执行其他任何操作之前对其进行验证。所以我在我的 FormRequest 中使用了以下代码:
public function rules()
{
return [
'csvFile' => 'required|file|mimes:csv'
];
}
我上传文件的格式是:
<form action="{{ route('uploadFile') }}" method="post" enctype="multipart/form-data">
{{ csrf_field() }}
<div class="form-group">
<label for="fileToUpload">CSV File to upload</label>
<input name="csvFile" type="file" class="form-control" id="fileToUpload" placeholder="Select file">
</div>
<button type="submit" class="btn btn-primary">Upload</button>
</form>
问题是它不起作用。尝试使用 getMimeType() 检查我的 test.csv 文件的 mime 类型,我得到:
"text/plain"
但如果我使用 getClientMimeType() 我会得到:
"text/csv"
从我读到的是:
客户端 mime 类型 (getClientMimeType()) 是 从上传文件的请求中提取,所以 不应被视为安全值。
对于受信任的 mime 类型,请改用 getMimeType()(它会猜测 基于文件内容的 mime 类型)。
显然,我应该使用 getMimeType(),但它不起作用(至少在大多数情况下)。
我试图通过这样做来模仿:
end(explode('.', $file->getClientOriginalName()));
这将返回 'csv' 作为结果,但感觉就像一个 hack!此外,它很容易被愚弄。
有没有办法安全地知道文件是否为 .csv 类型?
谢谢!
【问题讨论】:
-
你的测试用例中的csv文件的文件名是什么?
-
请添加您上传文件的表单,可能您必须包含'files' => 'true'
-
如果您的文件名包含空格,您的验证也会失败
-
表格添加有问题
-
看看这个问题,这可能对你有帮助laracasts.com/discuss/channels/general-discussion/…