Primefaces fileDownload非英文文件名损坏

时间:2012-05-02 03:02:22

标签: primefaces download filenames non-english

我正在使用Primefaces 3.2。我在使用primefaces fileDownload时遇到了问题。我可以上传文件并在服务器上保留他们的非英文名称(在我的情况下,这是俄语)。但是,当我使用p:fileDownload下载上传的文件时,我不能使用俄语字母,因为它们会被破坏。似乎DefaultStreamedContent类构造函数只接受拉丁字母。 我根据primefaces网站上的展示做了一切,如下所示。

public FileDownloadController() {          
    InputStream stream = ((ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext()).getResourceAsStream("/images/optimusprime.jpg");  
    file = new DefaultStreamedContent(stream, "image/jpg", "downloaded_optimus.jpg");  
}

我有什么想法可以解决我的问题?

提前谢谢。

1 个答案:

答案 0 :(得分:11)

这是fixed in the upcoming PrimeFaces 6.2,但对于早期版本,需要应用以下修复。在下面评论的链接中,发布了对PrimeFaces问题的引用,其中包含以下修复适用于Chrome,IE和Opera但不适用于FireFox的信息(未提及版本,也未提及'Edge')

解决方法

尝试以application/x-www-form-urlencoded MIME格式(URLEncoder)对文件名进行编码。

示例:

public StreamedContent getFileDown () {
        // Get current position in file table
        this.currentPosition();
        attachments = getAttachments();
        Attachment a = getAttachmentByPosition( pos, attachments );

        FileNameMap fileNameMap = URLConnection.getFileNameMap();
        // Detecting MIME type
        String mimeType = fileNameMap.getContentTypeFor(a.getAttachmentName());
        String escapedFilename = "Unrecognized!!!";
        try {
            // Encoding
            escapedFilename = URLEncoder.encode(a.getAttachmentName(), "UTF-8").replaceAll(
                    "\\+", "%20");
        } catch (UnsupportedEncodingException e1) {         
            e1.printStackTrace();
        }
        // Preparing streamed content
        fileDown = new DefaultStreamedContent( new ByteArrayInputStream( a.getAttachment() ),
                mimeType, escapedFilename);
        return fileDown;
    }