私は現在アンドロイドデバイスに関する私のウェブページで奇妙な問題に直面しています。アンドロイドデバイスのJSFストリーミングダウンロードは、.htmファイルを返します。
私がしたいのは、ユーザーが自分の携帯デバイスにpdfファイルをダウンロードできるようにすることです。したがって、私はhereの説明のようにダウンロードボタンを提供します。
デスクトップブラウザ* Mozilla Firefox 10 **を使用している限り、すべて動作しますが、モバイルデバイスに変更するとすぐに(SGS II、Androidバージョン2.3.5)ダウンロードの結果私が使っているブラウザアプリに依存します。
モバイルとモバイル:
どちらもファイルを正しくダウンロードできるようです。
他のブラウザアプリ(ビルトイン、イルカHD、...):
両方がのHTMLソースを示す-file .htmのを表す<filename>.pdf
か<filename>.htm
という名前のいずれかのファイルをダウンロードしますページ。私が試した何
:hereを説明するよう
がPrimeFacesライブラリ
public StreamedContent getFile() { // prepare file for download // reference webDAV directory and get file as stream this.file = new Helper().getWebDavFile(customerId, fileName); return file; }
の外に
StreamedContent
方法を使用し、ページに手動でファイルをストリーミングさ。 (BalusCにThxを)public void download() throws IOException { byte[] is = new Helper().getWebDavFileManually(customerId, fileName); FacesContext fc = FacesContext.getCurrentInstance(); ExternalContext ec = fc.getExternalContext(); ec.responseReset(); ec.setResponseContentType("application/pdf"); ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + fileName.toUpperCase() + "\""); OutputStream output = ec.getResponseOutputStream(); output.write(is); fc.responseComplete(); }
は、ファイルのローカルコピーに
<a href="">
を設定します。
(私は現在<p:commandButton>
を使用していますので、私は代わりに文字列を返すのリダイレクトを実行する方法を使用するようにしましたが、それは両方の方法で動作します)public void goToLink() throws IOException { // get WebDAV file and save temporarily byte[] b = new Helper().getWebDavFileManually(customerId, fileName); String path = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/") + fileName; File f = new File(path); try { FileOutputStream fos = new FileOutputStream(f); fos.write(b); link = "http://someurl/somepage/" + fileName; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // use link ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); ec.redirect(link); }
この最後のアプローチも私のAndroidデバイス上でうまく働きましたしかし私はのファイルをWebDAVからストリーミングするので、避けることができればをこのルートにしたくないということは、各ファイルをサーバーに保存する必要があるということです。これはより多くのIO負荷を生成し、手動でクリーンアップを強制します。
方法Helper().getWebDavFile
とHelper().getWebDavFileManually
いずれかPrimeFacesや私自身のアプローチのための[]バイトが使用するDefaultStreamedContenを返します。私がこれまで知っている何
:残念ながら
ない私の問題の解決策:)。
Googleを何時間も使用した結果、ダブルhttp-post-requestの可能性があることが判明しました。これによりアンドロイド内部ダウンロードマネージャ(ファイルが壊れている場合に使用)が発生し、状態が失われた追加のポストリクエストが送信されます。
で説明したように(セクションGET、POST、REST [UPDATE 20120208]を参照)と同じ問題に直面して、誰かがあります。私はこのブログで言及したすべてのアプローチを試しましたが、成功しませんでした。
この場合forum誰かがWireSharkと同じ動作を分析してほぼ同じ結論に達しました。
もうリソースが見つかりませんでしたので、私はこれに固執しています。
また、<p:fileDownload>
コンポーネントに関する既知の問題がないことを確認するため、PrimeFaces forumに投稿しました。
私が知りたいのですがどのような:
私は何かが足りないのですか?
アンドロイドデバイスのJSF(http-post操作)ウェブページからストリームファイルをダウンロードする可能性はありますか?
ご協力いただきありがとうございます。
ありがとうございます!
これは厄介な問題です。 POST *は本当に必須ですか?それはまさに犯人のように見えます。また、JSFマネージドBeanでGETアクションを実行することもできますが、これは単純なサーブレットを使用していました。 – BalusC
@BalusCこんにちは:)。いいえ、POSTは必須ではありません。あなたの提案を詳しく教えてください。私はJSFの新機能で、私のビュー・パラメータを使っています([リンク](http://stackoverflow.com/questions/9584736/jsf-file-download-nullpointerexception-with-view-parameter)の投稿を参照してください。私を助けた)GETを実行するのに十分でしょう。私は* servlet *アプローチにも興味があります。私は[look](http://balusc.blogspot.com/2007/07/fileservlet.html)を持ち、自分自身を助けることができるかどうかを見てみましょう。しかし、あなたの有名なキックオフの例はどれも評価されるでしょう:)。ありがとう、歓声! – SimonSez