2010-07-05 8 views
14

मैं अपने Google ऐप इंजन एप्लिकेशन में एक बहुत ही सरल अपलोड फॉर्म कर रहा हूं। ग्राहक GWT कोड में मैं की तरह कुछ है:ब्लॉबस्टोर पर अपलोड करने से जावा हेप आउटऑफमेमरी एरर

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

      }); 
     } 
    }); 

और यह एक new FileUpload() का उपयोग करता है फ़ाइल का चयन करने के लिए। जब मैं परीक्षण करते हैं, तो स्थानीय या तैनात उदाहरण पर, मैं लॉग में निम्न त्रुटि मिलती है:

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) 

दिलचस्प बात यह कई लोगों के सामने (सिर्फ this issue here को देखो इस मुद्दे में चलाने गए हैं लगता है, और आप Google पर कुछ और मिल सकते हैं) लेकिन किसी को भी यह नहीं लगता कि यह क्यों हो रहा है, और कुछ लोग यह भी ऐप इंजन की गलती का सुझाव दे रहे हैं। इससे पहले कि मैं इस तरह के दांत निष्कर्षों पर कूद गया, मैंने सोचा कि मैं पहले यहां पूछूंगा :)

और यदि यह दिलचस्प है, तो यहां प्रयास किए गए अपलोड (एक बहुत छोटी फ़ाइल) के HTTP शीर्षलेख हैं, जो HTTP लाइव हेडर के साथ कैप्चर किए गए हैं।

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

यदि आपके कोई विचार हैं तो कृपया मुझे बताएं। धन्यवाद!

+0

कैसे बड़ी फाइल अपलोड किए जा रहे है यह सुनिश्चित कर लें? – markovuksanovic

+1

@markovuksanovic यह किसी भी आकार की फ़ाइलों के लिए होता है, यहां तक ​​कि 10KB से कम फ़ाइलें भी। यह निश्चित रूप से मामला नहीं है कि मैं बस बहुत अधिक अपलोड कर रहा हूं - यह वही बात थी जो मैंने सोचा था, बिल्कुल :) :) –

+0

इसके अलावा, आप उपरोक्त कोड सूची में फ़ाइल की पूरी सामग्री देख सकते हैं। यह 57 बाइट्स है। –

उत्तर

15

ठीक है, इसलिए अविश्वसनीय रूप से मूर्ख समस्या यह साबित हुई कि मैंने फॉर्म के FileInput तत्व पर "नाम" विशेषता छोड़ी थी। यह स्पष्ट रूप से परिणामस्वरूप धारा को अयोग्य बनाता है, जो MimeMultipart पार्सर को स्मृति से बाहर निकलने का कारण बनता है।

भले ही समस्या मेरा समाप्त हो गया, और आसानी से ठीक करने योग्य था, फिर भी मैं इसे एपइंजिन में एक बग मानता हूं क्योंकि ऐसा कोई आसान गलती नहीं है कि आउटऑफमेमरी एरर और क्रैश हो; दुर्भावनापूर्ण HTTP अनुरोधों को क्राफ्ट करके यह डॉस भेद्यता का स्रोत भी हो सकता है। मैं Google के साथ एक बग रिपोर्ट दर्ज करूंगा।

+1

मुझे एक ही समस्या थी, लेकिन createUploadUrl() को पारित स्ट्रिंग पर अग्रणी "/" भी नहीं था। यह एक शून्य सूचक अपवाद का कारण बनता है - http://code.google.com/p/googleappengine/issues/detail?id=2771 –

+3

देखें यदि आप अपलोड करने से पहले FileUpload घटक को अक्षम करते हैं (उपयोगकर्ताओं को मूल्य बदलने से रोकने के लिए) यह भी कारण बनता है स्मृति अपवाद से बाहर। – pauli

4

और अपने रूप में जोड़ने के लिए

enctype="multipart/form-data" 
+0

हाँ यह मेरे लिए यह किया गया –

+0

यह मेरे लिए भी किया – csturtz

संबंधित मुद्दे