在Laravel中验证CSV文件

时间:2017-12-20 16:39:21

标签: php laravel csv request

我正在尝试上传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()));

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

有没有办法安全地知道某个文件的类型是.csv?

谢谢!

2 个答案:

答案 0 :(得分:0)

你可以使用必需的| mimes:csv,txt来验证csv文件。

答案 1 :(得分:0)

由于CSV基本上是一个文本文件,因此将根据文件扩展名检查其mime类型。您的文件是否具有.csv扩展名?

如果您还希望允许.txt扩展名,请将验证规则更改为此:

return [ 'csv_import' => 'required|mimes:csv,txt' ];