java - struts2不能检测文件内容? (重命名扩展麻烦)

标签 java file upload struts2

我们有一个用struts2 完成的应用程序。我们将上传的文件限制为 microsoft 文档和 acrobat pdf。一切顺利。但是当用户更改文件的扩展名时,struts 2 无法检测到该更改并接受该文件。

例如 logo.png -> logo.pdf

我们在struts2文件中的配置是这样的:

<interceptor-ref name="interceptorFileStack">
            <param name="fileUpload.allowedTypes">application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document</param>
            <param name="fileUpload.allowedExtensions">.pdf,.docx,.doc</param>
            <param name="fileUpload.maximumSize">4194304</param>
</interceptor-ref>

我以为allowedExtensions控制的是扩展名,allowedTypes控制的是文件的内容...

无论如何只用 struts 2 来检测扩展的变化?或者我需要另一个图书馆?有什么推荐吗?

最佳答案

大多数时候浏览器发送的 MIME-Type 是由文件扩展名派生出来的。因此重命名的 jpg->pdf 是一个“application/pdf”文件类型。

如果您不能信任您的用户并且必须确认正确的数据类型,您必须使用类似 Apache Tika 的东西或 JHOVE

Tika 的一个小例子是:

Path path = Paths.get("myfile.txt");
TikaConfig tika = new TikaConfig();
Metadata metadata = new Metadata();
metadata.set(Metadata.RESOURCE_NAME_KEY, path.toString());
String mimetype = tika.getDetector().detect(TikaInputStream.get(path), metadata).toString();
System.out.println("File " + path + " is " + mimetype);

(来自tutorial)

JHOVE 主要是一个您可以使用的图形用户界面/命令行工具,但也应该可以通过 API 使用它。

关于java - struts2不能检测文件内容? (重命名扩展麻烦),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42792283/

相关文章:

java - HttpSessionListener 未检测到 session 超时

python - 在python中使用变量创建txt文件

php - 使用 PHP 创建单个文件上传表单的最佳方法是什么?

c# - ASP.Net 处理程序 Request.Files 始终为空

c++ - 将单词和数字的文件输入数组 C++

php - 为什么这个基本的 imagejpeg() 缩放器返回黑色图像?

java - HikariCP 包装器(线程安全)

java - 如何在 Nitrous.IO 中预览/运行 Java 程序?

java - 如何在构造函数中获取资源?

java - 使用 BufferedReader 从 java 中的文本文件读取单引号