3

jsf BeanでJavaを使用して、Webサーバーからzipファイルをダウンロードしています。私のコードはJPEGではうまく機能しますが、ZIPでは機能しません。これが私のコードです。

private void createDownloadFile(final URL downloadUrl, final String mimeType) {
    final FacesContext fc = FacesContext.getCurrentInstance();
    final ExternalContext context = fc.getExternalContext();
    final HttpServletResponse response = (HttpServletResponse) context.getResponse();
    response.setContentType(mimeType);
    response.addHeader("Content-Disposition", "attachment; filename=\"" + downloadUrl + "\"");

    try{
        final OutputStream out = response.getOutputStream();
        IOUtils.copy(downloadUrl.openStream(), out);
        fc.responseComplete();
    }catch (final IOException exc){
      exc.printStackTrace();
    }

}

そして、これはエラーです:空の応答、空の応答がサーバーから受信されました。どんな助けでも大歓迎です。

4

1 に答える 1

1

空の応答、空の応答がサーバーから受信されました。

このメッセージは、ChromeのXML解析エラーとして認識されます。XMLパーサーは、要求されたXMLルート要素を見つけることができませんでした。あなたがやろうとしていることと組み合わせて、これはあなたがJavaScript/Ajaxによってファイルをダウンロードしようとしていたことを示唆しています。JavaScriptには明らかなセキュリティ上の理由から、変数に保持されているファイルコンテンツを含む[名前を付けて保存]ダイアログを強制する機能がないため、これを行うことはできません。

このエラーメッセージは、JSF ajax応答が特定のXML形式<partial-response><update>などを返すように定義されているために発生します。ただし<partial-response>、JSF ajax応答にルート要素がない場合、ブラウザ固有のXMLパーサーはこの種のエラーを表示する場合があります。

代わりに、同期要求によってファイルをダウンロードする必要があります。を削除する<f:ajax>か、サードパーティコンポーネントのajax-toggling属性false(など)をに設定し<p:commandButton ajax="false">ます。

応答ヘッダーを設定したので、ブラウザでのページ変更について心配する必要はありませんContent-Disposition: attachment。現在のページは同じままです。ちなみに、この問題はCommonsIOに固有のものではありません。

参照:

于 2012-10-01T10:59:10.400 に答える