2012-03-06 127 views
0

,当我有这样的代码:内容类型并不如预期上传Excel文件

<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> 

在我的分析器类:

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; 
    } 
} 

在我的项目到处都是擅长根据文件签它的内容类型,前一段时间他们工作得很好,但现在我无法理解他们为什么不能正常工作。

+0

*他们之前工作得很好* - 在什么之前? – pap 2012-03-06 12:08:04

+0

@pap我被告知他们前段时间工作得很好,但我刚开始使用该项目...... – 2012-03-06 12:34:09

回答

2

这是客户端事宜。 UploadedFile#getContentType()返回客户端在multipart/form-data部分的Content-Type标题字段中发送的任何内容。显然,有问题的客户端没有任何与上传文件的文件扩展名关联的MIME类型。如果客户端没有安装MS Excel,可能会发生这种情况。

作为服务器,您也可以根据文件扩展名ExternalContext#getMimeType()确定MIME类型,或者当您仍然使用古老的JSF 1.x版本时,可以使用ServletContext#getMimeType()

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

+0

我已经回答了如何解决这个问题。毕竟你永远不应该依赖客户特定的数据。你也不应该期望你所有的网页访问者都安装了MS Office。愚蠢的错误,吸取教训,咬紧牙关,立即修复它,并在下一次牢记它。可以发生:)祝你好运。 – BalusC 2012-03-06 13:23:44

相关问题