5

PrimefacesまたはTomahawkを使用してファイルのアップロードを行う方法を知っていますが、Apache Commons FileUploadを使用してファイルのアップロードを行おうとしていますが、これまでのところ、少し障害があります。フォームを使用していても、フォームmultipart/form-dataを送信すると、コンテンツタイプはになりapplication/x-www-form-urlencodedます。これが私のコードです

<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。に置くajax="false"p:commandButtonsubmit()メソッドは呼び出されませんが、取り出すとenctype="multipart/form-data"(まだ保持しますajax="false")、submit()呼び出されますが、マルチパートではないapplication/x-www-form-urlencodedため、apache commons fileuploadはマルチパートではないため、例外をスローします。私がしていることのように思えますが、私はマルチパートの要求を得ることができないようです。助けてください

4

1 に答える 1

12

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

<p:commandButton>デフォルトでレベル1のajaxリクエストを送信しますXMLHttpRequest。これはをサポートしていませmultipart/form-dataレベル2XMLHttpRequestのみがサポートしていますが、最新のブラウザー(HTML5もサポートしているブラウザー)でのみサポートされており、JSFJSAPIやPrimeFacesJSAPIには実装されていません。


p:commandButtonにajax = "false"を設定すると、submit()メソッドも呼び出されません。

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

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

今後の<h:inputFile>JSF2.2には、サーブレット3.0Partプロパティにバインド可能な新しいコンポーネントが含まれます。

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

private Part file;

JSF 2.2の最終リリースは第1四半期の終わりに予定されていますが、現在スナップショットリリースとして利用可能です。

于 2012-02-07T12:32:27.940 に答える