p:fileUpload allowTypes regex

时间:2014-07-15 14:20:42

标签: jsf primefaces jstl

用这个正则表达式/(.:/)(xml|xml.p7m)$/接受xxxxx.xml,xxxx.xml.p7m但不明白为什么接受xxxxx.xsl

            <p:fileUpload id="invoiceFileUploadId" widgetVar="invoiceFileUpload" fileUploadListener="#{menuController.uploadInvoice}" multiple="true"
            allowTypes="/(\.|\/)(xml|xml\.p7m)$/" label="#{label['upload']}" auto="true" dragDropSupport="true" process="@this" update="@this"
            invalidFileMessage="#{label['msg.fileNotValid']}" onstart="blockUI();" oncomplete="onCompleteUpload();"/>

2 个答案:

答案 0 :(得分:1)

也许这个问题有点旧,但是因为在Primefaces 6.1中问题仍然存在,我只是稍微调查了一下。

您对allowTypes使用以下值:

/(\.|\/)(xml|xml\.p7m)$/

我深入研究Primefaces JavaScript代码以找到实际检查类型的位置,并找到以下内容(格式化以提高可读性):

if (this.cfg.allowTypes 
    && !(
        this.cfg.allowTypes.test(a.type) 
        || this.cfg.allowTypes.test(a.name))) { 
    /* type not allowed */ 
}

提示:aFile,其属性name包含文件名,而且更有趣 - type包含文件的MIME类型(例如'应用/ PDF')。

上面的PF代码段显示,如果文件的名称和MIME类型都与allowTypes中指定的RegExp不匹配,则只会拒绝该文件。

对于XSL文件,MIME类型很可能是text/xml,它与RegExp匹配。正则表达式在两个完全不同的语义上下文中进行解释。

旁注:我一直想知道为什么Primefaces文档在正则表达式中有(\.|\/)部分。我的调查结果给我的印象是.用于文件扩展名匹配,/用于MIME类型匹配。我该判断谁?

更新

正如@kukeltje在评论中指出:正则表达式如: /\.(xml|xml\.p7m)$/可以解决问题。或者让我们说“避免问题”,因为问题的真正原因是正则表达式在两个完全不同的上下文中被解释。

答案 1 :(得分:-1)

如果您希望xsl也能正常工作,请像这样使用它。

allowTypes="/(\.|\/)(xsl|xml|xml\.p7m)$/"