Laravel在验证.csv文件时出现MIME问题

21

我已经阅读了一些关于在使用Laravel上传文件时检查文件扩展名的帖子。

我也遇到了同样的问题,甚至花费了一个小时来寻找解决方法。

这是我的验证规则的外观。

public function rules()
{
    return [
       'sheet' => 'required',
       'file' => 'mimes:csv',
    ];
} 

虽然需要工作文件,但在 MIME 上。

我尝试了几种其他方法,比如:

return [
    'sheet' => ['required', 'mimes:csv']
]

 

return [
    'sheet' => ['required', 'mimes:text/csv']
]

 

return [
    'sheet' => 'required|mimes:text/csv'
];

 

return [
    'sheet' => 'required|mimes:csv'
];

 

return [
    'sheet'          => 'required',
    'extension'      => 'required|in:csv'
];

以上的所有行都无法工作,有时会提示文件无效,有时则可以通过验证。

我怀疑是文件格式问题,于是我从微软网站下载了最新的样品文件。但问题并非在这里。

有人可以帮帮我吗?

谢谢!


尝试使用:application/csv - Gaurav Dave
没戏!我已经发布了答案。对我来说这个是有效的! - Hardik Raval
3个回答

35

惊讶!

CSV文件的MIME类型是text/plain,这就是问题的原因。

所以为了解决这个问题,我找到了负责处理text/plain的扩展名,发现是txt,然后我更新了我的规则:

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

1
我添加了一个 .sql 文件并应用了您的验证规则,但仍然通过了。 - Henry Bui
4
当我倾倒出文件变量并显示“mimeType:“text/csv””时,为什么会发生这种情况?请用更通俗易懂的语言重新表达。 - Utkarsh Pandey
5
这个答案不正确。因为用户也可以上传txt文件! - Sky
3
CSV实际上是文本,只是扩展名不同。 - Milkmannetje

7
我遇到了同样的问题,即使它是旧的,我希望这能帮助其他人。 要解决这个问题,你需要知道你的请求返回的MIME类型是什么,可以使用以下代码来查找:
dd($request->file('document')->getMimeType(),$request->file('document')->getClientOriginalExtension() );

所以在我的情况下,我上传的文件是CSV格式,但是得到了一个txt文件扩展名。因此,根据帖子中先前的答案,我解决了这个问题,只需将txt添加到请求验证中。
return [
    'sheet' => "required|mimes:csv,txt",
];

4

以下是我用于更完整的CSV验证的几种类型,希望对未来的使用有所帮助。

        return [
            'sheet' => 'required|mimetypes:text/csv,text/plain,application/csv,text/comma-separated-values,text/anytext,application/octet-stream,application/txt'
        ];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接