2010-07-05 4 views
14

Ich mache ein sehr einfaches Upload-Formular zu meiner Google App Engine-Anwendung. Im Client-GWT-Code habe ich so etwas wie:Upload zu Blobstore gibt einen Java-Heap OutOfMemoryError

final FormPanel uploadForm = new FormPanel(); 
uploadForm.setEncoding(FormPanel.ENCODING_MULTIPART); 
uploadForm.setMethod(FormPanel.METHOD_POST); 

uploadBtn.addClickHandler(new ClickHandler() { 
     @Override 
     public void onClick(ClickEvent event) { 
      blobstoreUploadURLService.getBlobstoreUploadURL("/banzai/process-pdf", new AsyncCallback<String>() { 

       @Override 
       public void onFailure(Throwable caught) { 
        // TODO Auto-generated method stub 
        System.err.println("FAILURE DURING UPLOAD SERVICE"); 
       } 

       @Override 
       public void onSuccess(String result) { 
        uploadForm.setAction(result); 
        uploadForm.submit(); 
       } 

      }); 
     } 
    }); 

Und es nutzt eine new FileUpload() um die Datei auszuwählen. Als ich es testen, entweder lokal oder auf einem bereitgestellten Beispiel, bekomme ich den folgenden Fehler in den Protokollen:

WARNING: Error for /_ah/upload/agdrYnNrYWFychsLEhVfX0Jsb2JVcGxvYWRTZXNzaW9uX18YAww java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOf(Arrays.java:2786) 
    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:71) 
    at javax.mail.internet.MimeMultipart.readTillFirstBoundary(MimeMultipart.java:316) 
    at javax.mail.internet.MimeMultipart.parse(MimeMultipart.java:186) 
    at javax.mail.internet.MimeMultipart.getCount(MimeMultipart.java:109) 
    at com.google.appengine.api.blobstore.dev.UploadBlobServlet.handleUpload(UploadBlobServlet.java:135) 
    at com.google.appengine.api.blobstore.dev.UploadBlobServlet.access$000(UploadBlobServlet.java:72) 
    at com.google.appengine.api.blobstore.dev.UploadBlobServlet$1.run(UploadBlobServlet.java:100) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.google.appengine.api.blobstore.dev.UploadBlobServlet.doPost(UploadBlobServlet.java:98) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:713) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:51) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
    at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:349) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938) 

Interessanterweise scheinen einige Leute in dieser Frage laufen zu haben, bevor (nur bei this issue here aussehen, und Sie kann bei Google ein paar mehr finden), aber niemand scheint eine Idee zu haben, warum es passiert, und einige Leute schlagen sogar vor, dass App Engine schuld ist. Bevor ich zu solchen voreiligen Schlüssen gesprungen bin, dachte ich, ich würde hier zuerst fragen :)

Und falls es interessant ist, hier sind die HTTP-Header des versuchten Uploads (eine sehr kleine Datei), erfasst mit HTTP Live Header.

 
    POST /_ah/upload/AMmfu6ZyyhSgz9uOR5VX4QBZeYADTB-aSejVvfGaogl3E_E8yPOLgtX9-0mob17IYfsaRZg-YP7aZrp1D4pDAwuKKm9CoNjeVx1eN2PwBro9x0PqXPeBLpQ/ALBNUaYAAAAATDFOaLPIvuEEhSS6F4HxMmf9xOb8lp0y/ HTTP/1.1 
    Host: kbskaar.appspot.com 
    User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
    Accept-Language: en-us,en;q=0.5 
    Accept-Encoding: gzip,deflate 
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
    Keep-Alive: 115 
    Connection: keep-alive 
    Referer: http://kbskaar.appspot.com/ 

    Cookie: Lastname=Wong; Firstname=Ka%20Man%20Sophia; Username=kmswong%40uwaterloo.ca 
    Content-Type: multipart/form-data; boundary=---------------------------168072824752491622650073 
    Content-Length: 57 
     -----------------------------168072824752491622650073-- 



    HTTP/1.1 500 Internal Server Error 
    Server: Upload Server Built on Jul 1 2010 15:26:59 (1278023219) 
    Content-Type: text/html; charset=UTF-8 
    X-AppEngine-Estimated-CPM-US-Dollars: $0.375815 
    X-AppEngine-Resource-Usage: ms=7103 cpu_ms=16217 api_cpu_ms=0 
    Date: Mon, 05 Jul 2010 03:06:00 GMT 
    Pragma: no-cache 
    Expires: Fri, 01 Jan 1990 00:00:00 GMT 
    Cache-Control: no-cache, no-store, must-revalidate 
    Content-Length: 3211 
     ---------------------------------------------------------- 

Bitte lassen Sie mich wissen, wenn Sie irgendwelche Ideen haben. Vielen Dank!

+0

Wie groß ist die Datei, die Sie hinzufügen? – markovuksanovic

+1

@markovuksanovic Es passiert für Dateien jeder Größe, sogar Dateien kleiner als 10KB. Es ist definitiv nicht der Fall, dass ich einfach zu viel hochlade - das war das erste, woran ich natürlich auch gedacht habe. –

+0

Außerdem können Sie den gesamten Inhalt der Datei in der Code-Liste oben sehen. Dieser ist 57 Bytes. –

Antwort

15

Okay, so stellte sich das unglaublich dumme Problem heraus, dass ich ein "Name" -Attribut auf dem FileInput Element des Formulars weggelassen hatte. Dies führt dazu, dass der resultierende Stream offensichtlich nicht verwertbar ist, wodurch der MimeMultipart-Parser nicht genügend Arbeitsspeicher hat.

Auch wenn das Problem meins war und leicht reparierbar war, halte ich dies immer noch für einen Fehler in AppEngine, weil es keinen solchen einfachen Fehler geben sollte, der OutOfMemoryError und Absturz verursachen sollte; Dies könnte auch eine Quelle für DOS-Sicherheitslücken sein, indem bösartige HTTP-Anfragen erstellt werden. Ich werde einen Fehlerbericht bei Google einreichen.

+1

Ich hatte das gleiche Problem, hatte aber auch kein führendes "/" in der Zeichenfolge, die an createUploadUrl() übergeben wurde. Das verursacht eine Nullzeiger-Ausnahme - siehe http://code.google.com/p/googleappengine/issues/detail?id=2771 –

+3

Wenn Sie die FileUpload-Komponente vor dem Hochladen deaktivieren (um zu verhindern, dass Benutzer den Wert ändern), wird dies ebenfalls verursacht die Ausnahme wegen nicht genügend Arbeitsspeicher. – pauli

4

und stellen Sie sicher, dass dies in Ihrem Formular hochladen

enctype="multipart/form-data" 
+0

ja, das war es für mich –

+0

das hat es auch für mich getan – csturtz

Verwandte Themen