2012-02-07 24 views
5

私はPrimefacesを使用してファイルをアップロードする方法やTomahawkを使用する方法を知っていますが、Apache Commons FileUploadを使用してファイルをアップロードしようとしています。ブロック。私のフォームはmultipart/form-dataを使用していますが、私のフォームを送信すると、コンテンツタイプはapplication/x-www-form-urlencodedになります。ここに私のコードここApache CommonsでファイルをアップロードするためのJSFの入手方法FileUpload

<h:body> 
    <h:form enctype="multipart/form-data"> 
     Upload File 
     <input type="file" name="file"/> 
     <p:commandButton value="Submit" action="#{viewBean.submit}"/> 
    </h:form> 
</h:body> 

である私は、含有量が上記タイプ印刷しようとすると、私のViewBean

@ManagedBean 
@ViewScoped 
public class ViewBean implements Serializable { 
    public void submit() { 
     String url = "/FileUploadServlet"; 
     FacesContext context = FacesContext.getCurrentInstance(); 
     try { 
      String contentType = context.getExternalContext().getRequestContentType(); 
      context.getExternalContext().dispatch(url); 
     } catch (Exception e) { 
      logger.log(Level.SEVERE, "Exception when calling Servlet", e); 
     } finally { 
      context.responseComplete(); 
     } 
    } 
} 

だから、それはapplication/x-www-form-urlencodedを示しています。私は私のp:commandButtonajax="false"を置く場合は、submit()方法であっても起動されませんが、私は(まだajax="false"を保つ)enctype="multipart/form-data"を取る場合submit()が呼び出されますが、それはマルチパートでされていない、そして、それはapplication/x-www-form-urlencodedなので、Apacheのコモンズが例外をスローするFileUploadそれはマルチパートではないからです。私が何をしているかのように見えます、私は複数の要求を得るようです。助けてください

答えて

12

上記のコンテンツタイプを印刷しようとすると、application/x-www-form-urlencodedが表示されます。

<p:commandButton>は、デフォルトでレベル1 XMLHttpRequestのAJAXリクエストを送信します。これはではなく、のサポートmultipart/form-dataです。 level 2 XMLHttpRequestのみサポートしていますが、最新のブラウザ(HTML5もサポートしています)ではサポートされており、JSF JS APIやPrimeFaces JS APIでは実装されていません。私はPに= "false" にAJAXを置く場合


:commandButtonのは、[送信()メソッドがない場合でもしかし、この方法でfullworthyを

を呼び出さmultipart/form-dataます送信されます。 submitメソッドが呼び出されないのは、バージョン2.2より前のJSFがmultipart/form-dataのボックスからの要求をサポートしていないからです。 JSFは、デフォルトでサブミットされたデータを、基礎となるHTTPサーブレット要求でrequest.getParameter()およびgetParameterMap()を使用して収集します。ただし、application/x-www-form-urlencoded以外のエンコードを使用した場合はnullが返されます。 JSFは、送信されたデータに基づいて呼び出されるアクション・メソッドを決定するため、データがnullの場合、そのメソッドを見つけて呼び出すことはできません。理論的には

、あなたがmultipart/form-data要求からデータを抽出するためにはApache CommonsのするFileUploadまたは新しいサーブレット3.0 request.getPart()/getParts()メソッドを使用し、getParameter()通話をオーバーライドするカスタム実装で現在のHTTPサーブレットリクエストをラップFilterを作成した場合抽出されたデータのマッピングが提供されている場合、JSFはgetParameter()呼び出しの結果に基づいて必要なジョブを実行できます。 this articleのサーブレット3.0 APIと、this answerのApache Commons FileUploadを利用するために少し変更された同じ例を使用して、具体的な例を見つけることができます。

今後のJSF 2.2には、Servlet 3.0 Partプロパティにバインド可能な新しい<h:inputFile>コンポーネントが追加されます。

private Part file; 

<h:form enctype="multipart/form-data"> 
    <h:inputFile value="#{bean.file}" /> 
    <h:commandButton value="submit" action="#{bean.submit}" /> 
</h:form> 

JSF 2.2最終リリースは、Q1の後半終了を予定したが、スナップショットの解放として現在入手可能です。

+0

ありがとうございました。このすべての情報を知っていることはとても素晴らしいことです。 –

+0

ようこそ。 – BalusC

+0

@BalusC '' Filter'を作成すると言っていましたが、 'h:form'に' enctype = "multipart/form-data" 'がある場合、アクションメソッドは起動しません。私はJSF 1.2です。なぜこれが起こっているのか教えてください。私は質問[ここ](http://stackoverflow.com/questions/14242293/hcommandbutton-is-not-firing-action-if-the-hform-has-enctype-multipart-form-d) –

関連する問題