在 Laravel 中验证 CSV 文件

chr*_*ang 5 php csv request laravel

我正在尝试上传一个 CSV 文件,我想在执行其他任何操作之前对其进行验证。所以我在 FormRequest 中使用以下代码:

public function rules()
{
    return [
        'csvFile' => 'required|file|mimes:csv'
    ];
}
Run Code Online (Sandbox Code Playgroud)

我用于上传文件的表格是:

<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>
Run Code Online (Sandbox Code Playgroud)

问题是它不起作用。尝试使用 getMimeType() 检查我的 test.csv 文件的 MIME 类型,我得到:

"text/plain"
Run Code Online (Sandbox Code Playgroud)

但是如果我使用 getClientMimeType() 我得到:

"text/csv"
Run Code Online (Sandbox Code Playgroud)

从我读到的是:

客户端 MIME 类型 ( getClientMimeType() ) 是从上传文件的请求中提取的,因此不应将其视为安全值

对于受信任的 MIME 类型,请改用getMimeType()(根据文件内容猜测 MIME 类型)。

显然,我应该使用 getMimeType(),但它不起作用(至少在大多数情况下)。

我试图通过这样做来模仿这一点:

end(explode('.', $file->getClientOriginalName()));
Run Code Online (Sandbox Code Playgroud)

这将返回 'csv' 结果,但感觉就像一个黑客!此外,它很容易被愚弄。

有没有办法安全地知道文件是否为 .csv 类型?

谢谢!

Kaz*_*blu 13

您可以用于required|mimes:csv,txt验证csv文件。