2

それぞれのファイルが見つからない場合にファイル ダウンロード リンクのクリックを処理するためのベスト プラクティスは何ですか?

特定の状況では、添付エンティティが DB に存在し、ファイル名のみを指し、ファイル ストレージ パスを個別/個別に構成できます。これはレガシー アプリ用であり、サポートする必要があります。

これは可能ですか?そのようなコードはどのように見えますか? 私は試した

    if ( file.canRead() )
    {
        byte[] data = FileUtils.readFileToByteArray( file );

        // goes to code like here: http://balusc.blogspot.de/2006/05/pdf-handling.html
        downloadFile( attachment.getFileName(), data );
    }
    else
    {
        this.log.errorv( "Attachment {0} not found in configured storage path {1}", file, this.storagePath );

        FacesContext facesContext = FacesContext.getCurrentInstance();

        facesContext.addMessage( null,
                                 new FacesMessage( FacesMessage.SEVERITY_ERROR, "Failed.",
                                                   "Downlosding file " + file + " failed! File doesn't exist in the configured storage path " + this.storagePath ) );

        // ???
        facesContext.responseComplete();
    }

しかし、これは

XML-Verarbeitungsfehler: Kein Element gefunden
Adresse: https://localhost:8181/cmc-compliance/view/prototype/collisionManager.xhtml
Zeile Nr. 1, Spalte 1:

( <rant>OMG、私は嫌いです...ええと、 int18nedエラーメッセージは嫌いです...誰かがこれが良い考えだと思った人を追い払う必要があります... )</rant>

OK、上記は「XML 処理エラー: 要素が見つかりません + 行 1、列 1」のようなものを意味します

私のコードは明らかに正しい方法ではありません...

データテーブルで JSF コードを使用しています。

<h:commandLink action="#{attachmentManager.downloadAttachment(att)}">
    <h:graphicImage library="images/icons" name="page_white.png" />
    <h:outputText value="#{att.fileName}" />
</h:commandLink>

私が理想的に望むのは、JSF メッセージ (または PrimeFaces のうなり声) を表示し、ページをそのままにしておくことです。つまり、同じページで完全な要求を再度発行する必要はありません。

これどうやってやるの?

4

1 に答える 1

2

基本的にfacesContext.responseComplete();、JSFが応答をレンダリングするのを妨げています。したがって、クライアントは完全に空の応答を取得します。ウェブブラウザはそれを最大限に活用しようとしています。Web ブラウザーが認識しているのは、要求されたリソースに.xhtmlファイル拡張子があることだけです。そのため、Web ブラウザーは、それが何らかの XML コンテンツであると想定します。次に、Web ブラウザーは空の応答を XML として解析しようとします。しかし、XML要素がまったくないため、指定されたエラーで惨めに失敗しました。つまり、整形式の XML ドキュメントには、少なくとも1 つのルート XML 要素が必要です。

行を削除しfacesContext.responseComplete();、通常の方法でメソッドから戻ります。この特定のケースでファイルのダウンロードを提供するなど、自分で応答に既に書き込みを行っている場合にのみ使用してください。facesContext.responseComplete();


OMG、私は int18ned エラーメッセージが嫌いです...誰かがこれが良い考えだと思った人を取り除くべきです...

プラットフォーム固有の設定で、それに応じてオペレーティング システム プラットフォームのデフォルト ロケールを変更するだけです。Windows の場合、スクリーンショット付きの関連する回答がここにあります: Getting OS language in java。プログラム自体 (Firefox/Chrome など) にもロケール関連の設定がある場合は、プログラム自体でも変更する必要があります。

于 2012-10-31T16:15:12.480 に答える