我讀過,有可能通過調整一下位置來使primefaces fileUpload與google appengine一起工作。它需要apache文件上傳和常見的io,所以我在我的WEB-INF/lib文件夾中添加了commons-fileupload-1.2.2.jar和commons-io-1.3.2.jar。獲得primefaces p:fileUpload在谷歌appengine下工作
然後按照primefaces的指示,我加入他們的servlet:
<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放在故意高,因爲它是該文件將被保存到磁盤上,而不是在保留它的字節數內存,因爲沒有文件可以使用谷歌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>
我瞭解,命令按鈕不得使用AJAX,它必須是一個完整的頁面重載。它似乎讓我無故障地上傳文件,但actionListener永遠不會被觸發。然後提交與命令按鈕的形式引發的異常:
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。當我搜索這個問題的解決方案時,常見的反應是谷歌appengine不喜歡我試圖將文件保存到磁盤的事實,並且解決方案僅僅是增加閾值,但閾值是儘可能高,所以它甚至不應該嘗試將文件保存到磁盤。
我會很感激任何幫助或建議,特別是如果解決方案明顯,我還沒有看到它。提前致謝。
任何人都在關注他們爲什麼標記這一點?我不必分享我的解決方案,但我可以讓任何人看到誰處於類似的情況。這可能並不理想,但迄今爲止它是最好的解決方案。 – Neil 2012-04-10 12:18:08