2012-04-08 48 views
1

我讀過,有可能通過調整一下位置來使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不喜歡我試圖將文件保存到磁盤的事實,並且解決方案僅僅是增加閾值,但閾值是儘可能高,所以它甚至不應該嘗試將文件保存到磁盤。

我會很感激任何幫助或建議,特別是如果解決方案明顯,我還沒有看到它。提前致謝。

回答

1

解決了這一問題通過重寫DiskItem爲Apache的FileUpload庫1.2 0.2。

具體來說,註釋靜態字符串UID(它使用黑名單類java.rmi.server.UID)和寫入方法的全部內容(我將設置閾值高,所以它永遠不需要調用它)。

顯然這不是理想的解決方案,但只要我不需要更新文件上傳庫,我懷疑我將在不久的將來需要更新文件上傳庫。

+0

任何人都在關注他們爲什麼標記這一點?我不必分享我的解決方案,但我可以讓任何人看到誰處於類似的情況。這可能並不理想,但迄今爲止它是最好的解決方案。 – Neil 2012-04-10 12:18:08

1

尼爾,你不能寫入磁盤(即你不能在GAE上使用fileupload.disk)。

App Engine文件系統對於您的應用程序始終是隻讀的。 你可能會考慮幾個選擇是:

此外,檢查出這一個: http://primefaces-rocks.appspot.com/ui/fileUploadSimple.jsf

+0

爲什麼我讀到它可能呢?你對此有正面評價嗎? – Neil 2012-04-08 19:27:12

+0

你是從哪裏讀到的,你可以發佈這個鏈接嗎? – alex 2012-04-08 19:29:42

+0

這是您請求的[link](http://davebarber.blog.com/2010/10/15/jsf-2-0-on-google-app-engine/)。 – Neil 2012-04-08 19:41:40

1

@ Neil

對不起,但我不能評論。你能告訴我你是怎麼改變的方法

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是什麼?

+1

我不記得我做了什麼。自從我做出修復以來,已經有一段時間了,但除非事情發生了變化,否則與UID相關的所有內容都不是我用它所需的。因此,你可能會放棄任何價值或根本沒有價值。 – Neil 2014-01-29 13:17:15