2012-04-08 1 views
1

私は、プライムフェイスfileUploadを微調整してgoogle appengineと連携させることが可能だと読んだことがあります。それはapacheのfileuploadとcommon ioを必要とするので、WEB-INF/libフォルダにcommons-fileupload-1.2.2.jarとcommons-io-1.3.2.jarを追加しました。プライムフェイスを取得するp:fileUploadをgoogle appengineの下で動作させる

その後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 App Engineを使用してファイルを保存することはできないため、決して選択肢にはなりません。

次のように実際の使用方法は次のとおりです。

<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は決して起動しません。

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のライブラリの適切なバージョンを取得していないかわからないんだけど。その後のcommandButtonを持つフォームを送信すると、例外がトリガされます。私が使用しているプラ​​イムフェイスのバージョンは3.2です。私がこの問題の解決策を探すとき、一般的な対応は、Google App Engineがファイルをディスクに保存しようとしているのが好きではなく、解決策は単にしきい値を上げることですが、しきい値はできるだけ高いので、をディスクに保存しようとするべきではありません。

私は何か助けや提案をいただきありがとうございます。特に解決策が明白であり、まだ見ていない場合は特にお勧めします。前もって感謝します。

答えて

1

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

特に、静的なString型のUID(ブラックリストに登録されたクラスjava.rmi.server.UIDを使用します)とwriteメソッドの内容全体をコメントします(しきい値を高く設定して呼び出す必要はありません)。

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

+0

誰かがこれをマークした理由についてコメントしていますか?私は自分の解決策を共有する必要はありませんでしたが、誰もが似たような状況にいるのを見ることができます。それは理想的ではないかもしれませんが、それは今のところ最高の解決策です。 – Neil

1

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

App Engineのファイルシステムは、あなたのアプリでは常に読み取り専用です。あなたが考えるかもしれません カップルの選択肢は以下のとおりです。

また、この1をチェックアウト: http://primefaces-rocks.appspot.com/ui/fileUploadSimple.jsf

+0

なぜ私はそれが可能だったと読んだのですか?あなたはそれについて肯定的ですか? – Neil

+0

どこを読んだのですか?リンクを投稿できますか? – alex

+0

あなたがリクエストした[リンク](http://davebarber.blog.com/2010/10/15/jsf-2-0-on-google-app-engine/)は次のとおりです。 – Neil

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の代わりに何を使いましたか?

+1

私は正確に何をしたのか思い出さない。私は修正を行ってからしばらくしていますが、事が変更されない限り、UIDに関連するものはすべて私が使用したものには必要ありません。したがって、あなたはおそらくそこに何か価値を置くか、何も置かないで逃げることができます。 – Neil

関連する問題