6

Primefaces3.2を使用しています。primefacesfileDownloadの使用に問題があります。ファイルをアップロードして、英語以外の名前をサーバーに保持できます(私の場合はロシア語です)。ただし、p:fileDownloadを使用してアップロードされたファイルをダウンロードすると、ロシア語の文字が破損するため使用できません。DefaultStreamedContentクラスコンストラクターはラテン文字のみを受け入れるようです。以下に示すように、私はprimefacesWebサイトのショーケースに従ってすべてを行っています。

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

問題を解決する方法はありますか?

前もって感謝します。

4

1 に答える 1

13

これは、今後の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;
    }
于 2013-02-24T12:17:20.820 に答える