2012-04-08 13 views
1

Ich habe gelesen, dass es möglich ist, primefaces fileUpload mit google appengine mit ein wenig Feinabstimmung zu arbeiten. Es erfordert Apache fileupload und common io, also habe ich commons-fileupload-1.2.2.jar und commons-io-1.3.2.jar zu meinem WEB-INF/lib-Ordner hinzugefügt.Getting primefaces p: fileUpload funktioniert unter google appengine

Dann folgen Sie die Anweisungen von primefaces, hat ich sich 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> 

Die thresholdSize gezielt hoch gesetzt werden, weil es die Anzahl von Bytes, mit denen die Datei nicht auf der Festplatte gespeichert werden, als es behält in Speicher, und da keine Dateien mit Google Appengine gespeichert werden können, kann es nie eine Option sein.

Die tatsächliche Nutzung ist wie folgt:

<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> 

Ich habe verstanden, dass die Befehlsschaltfläche nicht Ajax verwenden müssen und dass es muss eine ganze Seite neu laden sein. Es scheint, als ob ich die Datei ohne Probleme hochladen kann, aber der actionListener wird nie ausgelöst. Das Einreichen dann das Formular mit dem Befehlsschaltfläche löst eine Ausnahme:

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) 
... 

Ich bin nicht sicher, was ich tue etwas falsch oder ich habe einfach nicht die entsprechenden Versionen der Apache-Bibliotheken erhalten, um diese Arbeit richtig zu machen. Die Version von primefaces, die ich verwende, ist 3.2. Wenn ich nach einer Lösung für dieses Problem suchen, ist die allgemeine Antwort, dass Google Appengine nicht die Tatsache mag, dass ich versuche, eine Datei auf der Festplatte zu speichern, und die Lösung besteht einfach darin, den Schwellenwert zu erhöhen, aber der Schwellenwert ist so hoch wie es sein kann, so sollte es nicht einmal Versuch sein, um die Datei auf der Festplatte zu speichern.

Ich würde mich über jede Hilfe oder Vorschläge freuen, vor allem, wenn die Lösung offensichtlich ist und ich es noch nicht gesehen habe. Danke im Voraus.

Antwort

1

das Problem behoben, durch DiskItem für Apache zwingende Fileupload-Bibliothek 1.2 .2.

Speziell kommentierte statische String-UID (die Blacklist-Klasse java.rmi.server.UID verwendet) und den gesamten Inhalt der Schreibmethode (ich setze den Schwellenwert hoch, so dass es nie erforderlich sein sollte, ihn aufzurufen).

Offensichtlich ist es nicht die ideale Lösung, aber es funktioniert so lange, wie ich Dateiupload-Bibliothek nicht aktualisieren muss, die ich bezweifle, dass ich in naher Zukunft brauchen werde.

+0

Möchte jemand kommentieren, warum sie dies markiert haben? Ich musste meine Lösung nicht teilen, aber ich bin dafür, dass jeder sieht, wer sich in einer ähnlichen Situation befindet. Es ist vielleicht nicht ideal, aber es ist die beste Lösung bisher. – Neil

1

Neil, Sie können nicht auf die Festplatte schreiben (d. H. Sie können fileupload.disk nicht auf GAE verwenden).

App Engine-Dateisystem ist immer schreibgeschützt für Sie App. Ein paar Alternativen, die Sie vielleicht berücksichtigen sind:

Überprüfen Sie auch, diese: http://primefaces-rocks.appspot.com/ui/fileUploadSimple.jsf

+0

Warum habe ich gelesen, dass es dann möglich war? Bist du positiv dabei? – Neil

+0

Wo hast du das gelesen, kannst du den Link posten? – alex

+0

Hier ist die [link] (http://davebarber.blog.com/2010/10/15/jsf-2-0-on-google-app-engine/), die Sie angefordert haben. – Neil

1

@Neil

Es tut mir leid, aber ich kann nicht kommentieren.Können Sie mir sagen, wie Sie die Methode ändern

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; 
    } 

Was haben Sie anstelle von UID verwendet?

+1

Ich kann mich nicht erinnern, was ich genau gemacht habe. Es ist einige Zeit her, seit ich das Update gemacht habe, aber wenn sich die Dinge nicht geändert haben, ist alles, was mit der UID zu tun hat, nicht notwendig für das, wofür ich es benutzt habe. Daher könntest du wahrscheinlich damit davonkommen, irgendeinen Wert dort oder überhaupt zu setzen. – Neil

Verwandte Themen