2011-08-24 59 views
5

我正在使用Spring 3功能上传文件。我想知道验证文件是特定类型的最好方法,特别是csv文件。我确定检查扩展名是无用的,目前我正在检查上传的文件的内容类型。我只是确保它是“text/csv”类型。只是为了澄清这是客户上传的文件,意味着我无法控制其来源。Spring MVC上传文件 - 内容类型如何确定?

我很好奇Spring /浏览器如何确定内容类型是什么?这是确定上传文件的最佳/最安全的方式吗?我能100%确定吗?

更新:再次我不想知道如何确定内容类型是一个文件,但如何确定内容类型。 Spring /浏览器如何根据上传的文件知道内容类型是“text/csv”?

+0

有同样的问题。为什么Spring不支持像通常的java文件一样的“从容器中确定”选项?如果我将我的maven模块中的enconding设置为UTF-8,我希望我的文件默认具有此编码,并且我不需要手动更改 – borjab

回答

1

您可以使用

org.springframework.web.multipart.commons.CommonsMultipartFile对象。

它有getContentType();方法。

请看下面的例子http://www.ioncannon.net/programming/975/spring-3-file-upload-example/

你可以添加CommonsMultipartFile对象的简单的测试和重定向,如果它的内容类型是不正确的错误页面。

+0

我认为您误解了我的问题。我知道getContentType()并且已经在使用它了。问题是如何确定内容类型?我正在和一位同事进行辩论,他认为内容类型比扩展名更有用,因为它可以随意设置为任何内容。但我很好奇Spring /浏览器如何说这个文件是“text/csv”?这样做的目的是拒绝一个不是真正的csv文件的文件,你怎么能确定它是真的? – sauce

0

为什么你不只是把文件名你验证,并把它分解,文件类型为fileName.split(“\”)[filename.length() - 1]字符串

+0

文件扩展名基本上毫无价值,它看起来朝着正确的方向发展,但不会削减它。你可以有一个没有扩展名的文件,它是一个真正的CSV文件,浏览器/ Spring知道它是什么类型的文件。我想知道它是如何知道的。 – sauce

1

所以你也可以计算每行文件中逗号的数量。文件每行的逗号数通常应该等于一个有效的CSV文件。

+0

对于小文件来说不是一个坏主意......但是具有10万行的文件可能不切合实际。我想你可以检查前10行或其他东西。不是我正在寻找的,而是另一种手动验证的方式。我只是希望我知道我可以依靠正确设置的内容类型。 – sauce

0

好的,在这种情况下,我建议你使用Csvreader java库。你只需要检查你的csvreader对象,就这些。

0

据我所知,getContentType(String)方法可以从用户代理告诉它的任何东西中获得它的价值 - 所以你很谨慎,因为这很容易被欺骗。

对于二进制文件,您可以检查magic number或使用库,如mime-util或jMimeMagic。自Java 7以来还有​​,但它只适用于磁盘上的文件,并且在某些操作系统上报告了错误。