4

richfaces fileupload コンポーネントを使用してファイルをアップロードしようとしています。私の豆はビュースコープにあります。

ショーケースから抽出した私のコード。

            <rich:fileUpload  id="upload" immediateUpload="true" fileUploadListener="#{analyse.listener}"  acceptedTypes="png" ontyperejected="alert('Seulement les fichiers avec l'extension bam et pdf sont acceptés.');" maxFilesQuantity="3">
                  <a4j:ajax event="uploadcomplete" execute="@none" />        
            </rich:fileUpload>

呼び出される Bean 関数:

    public void listener(FileUploadEvent event) throws Exception {


    System.out.println("Listenner");

    UploadedFile item = event.getUploadedFile();

    System.out.println(item.getName());
    System.out.println(item.getSize());
    System.out.println(item.getContentType()) ;

}     

そして、アップロード用のファイルを追加しようとすると、美しいエラーが発生します:-(。ヘルプは大歓迎です。

11月6日 2013 19:00:43 org.richfaces.request.MultipartRequest25 parseIfNecessary GRAVE: マルチパート リクエストの解析例外: リクエスト プロローグを読み取れません org.richfaces.exception.FileUploadException: マルチパート リクエストの解析例外: リクエスト プロローグを org.richfaces.request で読み取れません.MultipartRequestParser.parse(MultipartRequestParser.java:156) の org.richfaces.request.MultipartRequest25.parseIfNecessary(MultipartRequest25.java:77) の org.richfaces.request.MultipartRequest25.getParameter(MultipartRequest25.java:114) の com.sun。 faces.context.RequestParameterMap.get(RequestParameterMap.java:75) で com.sun.faces.context.RequestParameterMap.get(RequestParameterMap.java:56) で java.util.Collections$UnmodifiableMap.get(Collections.java:1280) でcom.sun.faces.facelets.tag.ui.UIDebug.debugRequest(UIDebug. MultipartRequestParser.parse(MultipartRequestParser.java:148) ... 70 より多くの 6 nov. 2013 19:00:43 com.sun.faces.context.flash.ELFlash$PreviousNextFlashInfoManager デコード GRAVE: JSF1094: 受信 Cookie 値 3Xfn_ からフラッシュ データをデコードできませんでした。処理は続行されますが、この要求に対してフラッシュを使用できません。11月6日 . (PartialViewContextImpl.java:485) com.sun.faces.context.PartialViewContextImpl.access$300 で (PartialViewContextImpl.java:73) com.sun.faces.context.PartialViewContextImpl$DelayedInitPartialResponseWriter で。ErrorReportValve.invoke(ErrorReportValve.java:99) org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) org .apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol) .java:589) で org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) で java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) で java. util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) で java.lang.Thread.run(Thread.java:680) 6 nov. 2013 19:00:43 組織。process(AbstractHttp11Processor.java:1023) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JioEndpoint.java:312) java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) で java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) で java.lang.Thread.run(Thread.java) :680) 11月6日 2013 19:00:43 org.richfaces.request.MultipartRequest25 parseIfNecessary GRAVE: マルチパート リクエストの解析例外: リクエスト プロローグを読み取れません org.richfaces.exception.FileUploadException: マルチパート リクエストの解析例外: リクエスト プロローグを org.richfaces.request で読み取れませんorg.richfaces.request の .MultipartRequestParser.parse(MultipartRequestParser.java:156)。java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor. java:895) で java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) で java.lang.Thread.run(Thread.java:680) で発生: java.io.IOException: プロローグを要求できませんorg.richfaces.request.MultipartRequestParser.readProlog(MultipartRequestParser.java:270) で org.richfaces.request.MultipartRequestParser.initialize(MultipartRequestParser.java:172) で org.richfaces.request.MultipartRequestParser.parse(MultipartRequestParser.java :148) ... 34 11 月 6 日 2013 19:00:43 com.sun.faces.context.flash. ELFlash$PreviousNextFlashInfoManager デコード GRAVE: JSF1094: 受信 Cookie 値 3Xfn_ からフラッシュ データをデコードできませんでした。処理は続行されますが、この要求に対してフラッシュを使用できません。11月6日 . (PartialViewContextImpl.java:485) com.sun.faces.context.PartialViewContextImpl.access$300 で (PartialViewContextImpl.java:73) com.sun.faces.context.PartialViewContextImpl$DelayedInitPartialResponseWriter.getWrapped(PartialViewContextImpl.java:619) で javax .faces.context.PartialResponseWriter.startDocument(PartialResponseWriter.java:116) org.

4

1 に答える 1

8

要約:を使用します<h:inputFile />。少なくとも<rich:fileUpload>、JSF-2.2 で作業することはできませんでした。

長いバージョン: 1 日いじり回した後<rich:fileUpload>、Servlet-3.0 仕様に準拠しているサーブレット コンテナーは、岩と固い場所の間に置かれているという結論に達しました。

起こっているように見えるのは、Tomcat (または Servlet-3.0 以降を実装する任意のサーブレット コンテナー - 私は Wildfly の undertow で試しました) が、HttpServletRequest#getParts()メソッドを介してマルチパート POST 送信を利用できるようにすることです。また、フォーム データを適切に解析し、明示的に述べているServletRequest#getParameterを介して使用できるようにします。

HTTP POST リクエストで発生するように、パラメータ データがリクエスト ボディで送信された場合、getInputStream() または getReader() を介してボディを直接読み取ると、このメソッドの実行が妨げられる可能性があります。

存在しないパラメーター名でメソッドをMultipartRequest25呼び出すと、これは正確に何をしますか:getParameter

 String parameter = super.getParameter(name);
 if (parameter != null) {
     return parameter;
 }
 parseIfNecessary();

このparseIfNecessary()部分はプロローグを読み取ろうとしますが、コンテナーは既に要求本文を解析しているため、ストリームは空であり、ストリームから読み取ると、表示されてEOFいる に変換される即時が生成されIOExceptionます。

クラスの命名から、これは Servlet-2.5 コンテナー用に作成されたものであり、おそらくこれが機能し、情報がすぐに入手できないことがわかりました。

この時点で、JSF-2.2 の使用を活用してh:inputFileに切り替えることにしました。h:inputFile は、最新の (執筆時点) Mojarra-2.2.5 (Myfaces は試していません) を使用すると素晴らしい動作をします。

次に例を示します。

<h:form id="fileUploadForm" enctype="multipart/form-data">
    <h:inputFile value="#{docMgr.file}" required="true">
        <f:ajax listener="#{docMgr.saveFile}" render="@form" />
    </h:inputFile>
    <h:messages />
</h:form>

Mojarra-2.2.5 より前のバージョンでは、上記の例のように ajax 送信に問題があったことに注意してください (これは RichFaces のimmediateUpload.

于 2014-01-16T09:01:32.817 に答える