上传Excel文件时,内容类型不符合预期

时间:2012-03-06 11:10:24

标签: java jsf tomahawk

我有这段代码:

 <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文件都会根据其内容类型进行检查,它们在前一段时间内工作正常,但现在我无法理解为什么它们无法正常工作。

1 个答案:

答案 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)解析它,并检查它是否在解析时不会抛出异常。