我有这段代码:
<h:form id="form" enctype="multipart/form-data">
<t:inputFileUpload id="eFile" value="#{Parser.uploadFile}" storage="file"/>
<t:commandButton value="Parse" action="#{Parser.parse}"/>
</h:form>
在我的Parser课程中:
public class Parser {
public Parser() {
}
public String parse() {
//it should be 'application/vnd.ms-excel' type
//since i'm uploading an excel file saved in MS Excel 2007
System.err.print(uploadFile.getContentType());
// but its content-type is 'application/octet-stream'
return null;
}
public UploadedFile getUploadFile() {
return uploadFile;
}
public void setUploadFile(UploadedFile uploadFile) {
this.uploadFile = uploadFile;
}
}
在我的项目中,每个excel文件都会根据其内容类型进行检查,它们在前一段时间内工作正常,但现在我无法理解为什么它们无法正常工作。
答案 0 :(得分:2)
这是客户端问题。 UploadedFile#getContentType()
返回客户端在multipart / form-data部分的Content-Type
头字段中发送的任何内容。显然,有问题的客户端没有与上传文件的文件扩展名相关联的任何mime类型。如果客户端没有安装MS Excel,就会发生这种情况。
作为服务器,您还可以根据ExternalContext#getMimeType()
的文件扩展名确定mime类型,或者当您仍然使用ServletContext#getMimeType()
时仍然使用古代JSF 1.x时。 / p>
String filename = FilenameUtils.getName(uploadedFile.getName()); // This is available by Commons IO which you should already have.
String mimetype = FacesContext.getCurrentInstance().getExternalContext().getMimeType(filename);
// ...
mime类型信息是从<mime-mapping>
中的web.xml
个条目获得的。 servletcontainer有一个完整的列表,它有自己的默认web.xml
(例如Tomcat,你可以在它的/conf
文件夹中找到它)。您可以在您的webapp自己的web.xml
中扩展/覆盖它,如下所示:XLSX:
<mime-mapping>
<extension>xlsx</extension>
<mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type>
</mime-mapping>
请注意,此检测纯粹基于文件扩展名,而不是文件内容。因此,当客户端编辑了文件扩展名时,这不会阻止错误检测。最可靠的是使用真正的Excel文件解析器(如Apache POI或JExcelAPI)解析它,并检查它是否在解析时不会抛出异常。