struts2 无法检测文件内容? (重命名扩展麻烦)
Can't struts2 detect the content of a file? (Renaming extension trouble)
我们已经完成了 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 or 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 主要是您可以使用的 gui/commandline 工具,但也应该可以通过 API.
使用它
我们已经完成了 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 or 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 主要是您可以使用的 gui/commandline 工具,但也应该可以通过 API.
使用它