私は、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が気に入らないというものです。解決策は単にしきい値を上げることですが、しきい値は可能な限り高いので、ファイルをディスクに保存 しようとしてもいけません。
特に解決策が明白で、まだ見たことがない場合は、助けや提案をいただければ幸いです。前もって感謝します。