2009-10-22 16 views
8

現在、Java Server Facesを使用してファイルをアップロードしています。私はRichFacesを使ってthis great introductionを見つけました。しかし、私はここでプロセスを理解するのに苦労しています。RichFacesを使用したファイルアップロード

最初にユーザーがファイルを選択し、即時アップロードがtrueに設定されている場合、ファイルはajaxを使用して処理されます。それはしかし、次のステップになると、Bean側のリスナーは、以下が私を混乱させる:

public void listener(UploadEvent event) throws Exception{ 
    UploadItem item = event.getUploadItem(); 

    File f = item.getFile(); 

    System.out.println(f.getAbsolutePath()); 
} 

絶対パスは自分のコンピュータ上の一時ディレクトリにある、確か私がいることを理解し、しかし、あなたはどのようになるだろうファイルはWebアプリケーションに使用できますか?私のアプリケーションはWARファイルとしてデプロイされます。それをWARにアップロードすることは可能ですか?愚かに聞こえるかもしれませんが、実際には便利かもしれません。

ファイル名を変更して新しい場所にコピーすることができますが、その方法はありますか?

答えて

5

あなたのWARディレクトリに物を書くことは、一般的には悪い考えです(アプリケーションディレクトリにデータを格納するのは悪い考えです)。

おそらく、永続ストア、通常はデータベースに格納することをお勧めします。正確に管理する方法は、ファイルシステムを使用してデータベースに参照を格納するか、データベースにBLOBを直接格納するか、またはJDBCまたはJPAまたはHibernateなどを使用するかどうかにかかわらず、あなた次第です。

<a4j:support event="onuploadcomplete" reRender="info" />のようなものを使用して、それらを含むパネルをリフレッシュすることによって、アップロードされたファイルをデータベースから読み取ることができます。

ファイルダウンロードサーブレット(RichFacesが持っていない場合)は、かなり簡単に書くことができます。

+0

:あなたは再ダウンロードしたファイルにしたい場合は、次のようなJSFセッション/ビューBean内のメソッドへのリンクとしてそれを提供することができます。ダウンロードサーブレットを作成する必要があります。 –

+0

ダウンロードサーブレットFilipを作成する方法を知りましたか?私はfileUploadコンポーネントを使って遊んだし、私の人生のために、ファイルをアップロードした後どこに行くのか分からない。 – MattSayar

5

これはどれくらい助けになるのかよく分かりませんが、これはリスナーと同等のサーバー側で使用するコードです。

public String uploadFile(UploadEvent event) { 
    UploadItem item = event.getUploadItem(); 

    String name = "unnamed_attachment"; 
    byte[] data = item.getData(); 

    try { 
     name = FilenameUtils.getName(item.getFileName()); 
     data = FileUtils.readFileToByteArray(item.getFile()); 
     logger.info("data.length = " + data.length); 
     UploadDetails details = new UploadDetails(); // This is a javabean that gets persisted to database (actually a ejb3 entity bean, but thats irrelevant) 

     details.setBytes(data); 
     details.setResume(true); 
     // Save to database here 

    } catch (Exception e) { 
     FaceletsUtil.addSystemErrorMessage(); 
     logger.error(e, e); 
    } 
    return null; 
} 

大きな疑問が残っていますが、「ファイルをウェブアプリケーションでどのように利用できますか?バイト配列はすぐに利用可能です。私は、それをクリアするためのおかげで思ったよう

<h:commandButton action="#{Manager.downloadFile}" value="Download report">        </h:commandButton> 

public void downloadFile() { 
    final HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); 

    response.setHeader("Content-Disposition", "attachment;filename=radar-report" + new Date() + ".pdf"); // or whatever type you're sending back 
    try { 
     response.getOutputStream().write(uploadDetails.getBytes()); // from the UploadDetails bean 
     response.setContentLength(uploadDetails.getBytes().length); 
     response.getOutputStream().flush(); 
     response.getOutputStream().close(); 
    } catch (IOException e) { 
     logger.error(e, e); 
    } 
    FacesContext.getCurrentInstance().responseComplete(); 
} 
関連する問題