2010-07-05 30 views
14

Tôi đang làm một biểu mẫu tải lên rất đơn giản cho ứng dụng Google App Engine của mình. Trong mã GWT của khách hàng, tôi có một cái gì đó như:Tải lên Blobstore cung cấp một heap Java 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(); 
       } 

      }); 
     } 
    }); 

Và nó sử dụng new FileUpload() để chọn tệp. Khi tôi kiểm tra nó, mạng cục bộ hoặc một trường hợp triển khai, tôi nhận được lỗi sau đây trong các bản ghi:

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) 

Điều thú vị đủ, nhiều người dường như đã chạy vào vấn đề này trước (chỉ cần nhìn vào this issue here, và bạn có thể tìm thấy một vài thứ khác trên Google) nhưng dường như không ai biết tại sao nó lại xảy ra và một số người thậm chí còn cho rằng đó là lỗi của App Engine. Trước khi tôi nhảy vào kết luận phát ban này, tôi nghĩ tôi sẽ hỏi ở đây trước tiên :)

Và trong trường hợp nó thú vị, đây là tiêu đề HTTP của tải lên đã cố gắng (một tệp rất nhỏ), được bắt với HTTP Live Headers.

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

Vui lòng cho tôi biết nếu bạn có bất kỳ ý tưởng nào. Cảm ơn!

+0

Làm thế nào lớn là các tập tin bạn đang tải lên? – markovuksanovic

+1

@markovuksanovic Điều này xảy ra đối với các tệp có kích thước bất kỳ, ngay cả tệp nhỏ hơn 10KB. Chắc chắn không phải trường hợp tôi tải lên quá nhiều - đó cũng là điều đầu tiên tôi nghĩ đến, dĩ nhiên :) –

+0

Ngoài ra, bạn có thể xem toàn bộ nội dung của tệp trong danh sách mã ở trên. Đây là 57 byte. –

Trả lời

15

Được rồi, vậy vấn đề cực kỳ ngớ ngẩn hóa ra là tôi đã để lại một thuộc tính "tên" trên phần tử FileInput của biểu mẫu. Điều này rõ ràng làm cho luồng kết quả không thể duyệt được, làm cho trình phân tích cú pháp MimeMultipart hết bộ nhớ.

Mặc dù vấn đề kết thúc là của tôi, và dễ dàng sửa chữa, tôi vẫn coi đây là lỗi trong AppEngine vì không có cách nào sai lầm đơn giản như vậy sẽ gây ra lỗi OutOfMemoryError và lỗi; điều này cũng có thể là một nguồn của lỗ hổng DOS chỉ bằng cách tạo ra các yêu cầu HTTP độc hại. Tôi sẽ gửi báo cáo lỗi với Google.

+1

Tôi đã có cùng một vấn đề, nhưng cũng không có một "/" hàng đầu trên chuỗi được chuyển đến createUploadUrl(). Điều đó gây ra ngoại lệ con trỏ null - xem http://code.google.com/p/googleappengine/issues/detail?id=2771 –

+3

Nếu bạn vô hiệu hóa thành phần Tải lên tệp trước khi tải lên (để ngăn người dùng thay đổi giá trị), điều này cũng gây ra ngoại lệ bộ nhớ. – pauli

4

và chắc chắn để thêm video này trong hình thức của bạn

enctype="multipart/form-data" 
+0

có điều này đã làm cho tôi –

+0

điều này đã làm điều đó cho tôi cũng – csturtz

Các vấn đề liên quan