4

こんにちは、JSF と Primefaces を使用して、ファイルのアップロードとダウンロードを同じファイル操作で行っています。

さまざまなフォーラムとブログ (BelusC のブログと Primefaces Showcase) を組み合わせた手法を使用しています。

この操作の主なアイデアは、ユーザーがファイルをアップロードし、アップロードされたファイルのダウンロード リンクを生成して、送信前にダウンロードして表示できるようにすることです。

これが私のコードです:

index.xhtml

<h:form>
    <p:fileUpload showButtons="false" label="Attach Refrral" 
        auto="true" fileUploadListener="#{fileBean.uploadListener}"/>
</h:form>

<h:form >
   <p:commandLink>
      See Uploaded File
      <p:fileDownload value="#{fileBean.refrralFile}"/>
   </p:commandLink>
</h:form>

FileBean.java

private StreamedContent refrralFile;


    public void uploadListener(FileUploadEvent evt)throws Exception
    {
        UploadedFile fx = evt.getFile();

        File mainDir = new File("C:/","fileStorage");
        if(!mainDir.exists())
        {
            mainDir.mkdir();
        }
        File subDir = new File(mainDir,"AttachedRefrrals");
        if(!subDir.exists())
        {
            subDir.mkdir();
        }
        String fileName = fx.getFileName();

        File f = new File(subDir,fileName);
        FileOutputStream fos = new FileOutputStream(f);
        IOUtils.copy(fx.getInputstream(), fos);

        InputStream is = ((ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext()).getResourceAsStream(f.getAbsolutePath());
        refrralFile  = new DefaultStreamedContent(is, new MimetypesFileTypeMap().getContentType(f), fileName);

    }


    public StreamedContent getRefrralFile() {
        return refrralFile;
    }

上記のコードを使用すると、ファイルは正常にアップロードされますが、ファイルのダウンロード リンクをクリックすると例外がスローされます。

java.lang.IllegalStateException: getOutputStream() has already been called for this response

FacesContext#responseComplete()を使用しましたが、多くの場所で提案されているため、ダウンロード リンクがまったく機能しません。

私のテクニックやコードが間違っている場合は修正してください。ご存知の場合は、より良い方法を提案してください。

4

1 に答える 1

12

<p:commandLink>、デフォルトで ajax リクエストを起動します。ajax経由でファイルをダウンロードすることはできません。ajax リクエストの処理を担当する JavaScript は、取得したバイナリ ファイルをどう処理すればよいかわかりません。これは、予想される XML レスポンスとは大きく異なります。JavaScript には、明らかにセキュリティ上の理由から、任意のコンテンツで [名前を付けて保存]ダイアログをトリガーする機能がありません。

したがって、具体的な問題を解決するには、使用します

<p:commandLink ajax="false">

あるいは単に

<h:commandLink>

以下も参照してください。

于 2013-04-10T12:10:21.743 に答える