【问题标题】:Spring MVC Upload File - How is Content Type determine?Spring MVC 上传文件 - 内容类型如何确定?
【发布时间】:2011-11-03 01:06:33
【问题描述】:

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

我很好奇 Spring/浏览器如何确定内容类型是什么?这是确定已上传哪种文件的最佳/最安全方法吗?我能百分百确定吗?

更新:同样,我不是想知道如何确定文件的内容类型,而是如何确定内容类型。 spring/浏览器如何根据上传的文件知道内容类型是“text/csv”?

【问题讨论】:

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

标签: spring spring-mvc mime-types content-type


【解决方案1】:

你可以使用

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

它有getContentType(); 方法。

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

您可以在 CommonsMultipartFile 对象上添加简单测试,如果内容类型不正确,则重定向到错误页面。

【讨论】:

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

为什么你不只是在你的验证器中获取文件名并拆分它,文件类型是 fileName.split("\.")[filename.length()-1] string

【讨论】:

  • 文件扩展名本质上是毫无价值的,它看起来是正确的方向,但不会削减它。你可以有一个没有扩展名的文件,它实际上是一个 CSV 文件,并且浏览器/Spring 知道它是什么类型的文件。我想知道它是怎么知道的。
【解决方案3】:

因此,您还可以计算文件中每行的逗号数。文件的每一行通常应该有相同数量的逗号才能成为有效的 CSV 文件。

【讨论】:

  • 对于小文件来说不是一个坏主意..但是 100k 行的文件可能不适合全部浏览。我想您可以检查前 10 行或其他内容。不完全是我正在寻找的东西,而只是另一种手动验证的方式。我只是希望我知道我可以依赖正确设置的内容类型。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    据我所知,getContentType(String) 方法的价值来自用户代理告诉它的任何内容 - 所以你要小心,因为这很容易被欺骗。

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

    【讨论】:

    • 我认为有一种方法可以获取 TMP 文件的路径并在复制到目标之前探测该路径。
    猜你喜欢
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2015-05-22
    相关资源
    最近更新 更多