1

私は、primefacesfileUploadを少し調整することでgoogleappengineで動作させることが可能であることを読みました。apachefileuploadとcommonioが必要なため、commons-fileupload-1.2.2.jarとcommons-io-1.3.2.jarをWEB-INF/libフォルダーに追加しました。

次に、primefacesの指示に従って、サーブレットを追加しました。

<filter>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
    <init-param>
        <param-name>thresholdSize</param-name>
        <param-value>2147483647</param-value>
    </init-param>       
</filter>
<filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>  

thresholdSizeは、ファイルをメモリに保持するのではなくディスクに保存するバイト数であるため、意図的に高く設定されています。また、Google AppEngineを使用してファイルを保存することはできないため、オプションにすることはできません。

実際の使用法は次のとおりです。

<h:form enctype="multipart/form-data">
    <!-- Other text fields go here -->
    <p:fileUpload fileUploadListener="#{tjBean.onHandleFileUpload}"  
        mode="advanced"  
        update=":toolbarForm:globalMessages"  
        sizeLimit="500000"   
        allowTypes="/(\.|\/)(txml)$/" /> 
<p:commandButton value="Okay" ajax="false" actionListener="#{tjBean.onSaveAction}" />
</h:form>

commandButtonはajaxを使用してはならず、ページ全体をリロードする必要があることを理解しました。問題なくファイルをアップロードできるようですが、actionListenerがトリガーされることはありません。次に、commandButtonを使用してフォームを送信すると、例外がトリガーされます。

java.lang.NoClassDefFoundError: Could not initialize class org.apache.commons.fileupload.disk.DiskFileItem
    at org.apache.commons.fileupload.disk.DiskFileItemFactory.createItem(DiskFileItemFactory.java:199)
    at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:361)
...

何が間違っているのかわからないか、これを正しく機能させるための適切なバージョンのapacheライブラリを取得できませんでした。私が使用しているprimefacesのバージョンは3.2です。この問題の解決策を探すとき、一般的な応答は、ファイルをディスクに保存しようとしているという事実をgoogle appengineが気に入らないというものです。解決策は単にしきい値を上げることですが、しきい値は可能な限り高いので、ファイルをディスクに保存 しようとしてもいけません。

特に解決策が明白で、まだ見たことがない場合は、助けや提案をいただければ幸いです。前もって感謝します。

4

3 に答える 3

1

ニール、ディスクに書き込むことはできません(つまり、GAEでfileupload.diskを使用することはできません)。

App Engineファイルシステムは、アプリに対して常に読み取り専用です。あなたが考えるかもしれないいくつかの選択肢は次のとおりです。

また、これをチェックしてください:http: //primefaces-rocks.appspot.com/ui/fileUploadSimple.jsf

于 2012-04-08T19:19:06.500 に答える
1

Apacheファイルアップロードライブラリ1.2.2のDiskItemをオーバーライドすることで問題を修正しました。

具体的には、コメント化された静的文字列UID(ブラックリストに登録されたクラスjava.rmi.server.UIDを使用)と書き込みメソッドの内容全体(しきい値を高く設定するため、呼び出す必要はありません)。

明らかにそれは理想的な解決策ではありませんが、ファイルアップロードライブラリを更新する必要がない限り機能します。これは近い将来必要になるとは思えません。

于 2012-04-08T21:01:38.447 に答える
1

@ニール

申し訳ありませんが、コメントはできません。方法を変える方法を教えてください

getTempFile() {
        if (tempFile == null) {
            File tempDir = repository;
            if (tempDir == null) {
                tempDir = new File(System.getProperty("java.io.tmpdir"));
            }

            String tempFileName = format("upload_%s_%s.tmp", UID, getUniqueId());

            tempFile = new File(tempDir, tempFileName);
        }
        return tempFile;
    }

UIDの代わりに何を使用しましたか?

于 2014-01-29T09:45:55.697 に答える