2013-02-23 87 views
1

我在使用jQuery Mobile 1.3.0設計我的blobstore upload form JSP頁面時遇到了一個非常不尋常的問題。我張貼下面的代碼。jQuery Mobile中的GAE Blobstore異常

<%@ page import="com.google.appengine.api.blobstore.BlobstoreServiceFactory"%> 
<%@ page import="com.google.appengine.api.blobstore.BlobstoreService"%> 
<head> 
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.css" /> 
<link rel="stylesheet" href="/css/common.css" /> 
<script src="http://code.jquery.com/jquery-1.8.2.min.js"></script> 
<script src="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.js"></script> 
</head> 
<body> 
<% 
    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); 
%> 
<form method="POST" action="<%=blobstoreService.createUploadUrl("/upload")%>" 
    id="uploadImageForm" enctype="multipart/form-data"> 
    <label for="newsTitle">New Title</label> 
    <input type="text" name="newsTitle" id="newsTitle" placeholder="Please enter some title" /> 
    <div style="clear: both; width: 100%;"></div> 

    <label for="newsDescription">New Description</label> 
    <textarea name="newsDescription" id="newsDescription" placeholder="Please enter some description" rows="10"></textarea> 
    <div style="clear: both; width: 100%;"></div> 

    <label for="newsPic">Choose Image (if any)</label> 
    <input type="file" name="newsPic" id="newsPic" class="newsPic" /> 
    <div style="clear: both; width: 100%; height: 10px;"></div> 

    <input type="submit" name="submit" data-role="button" data-inline="true" value="Submit" /> 
    </form> 
</body> 

我收到這個異常,當我試圖通過這種形式上傳任何文件到blobstore。

WARNING: Error for /_ah/upload/agpsdW1paW5uZXdzchsLEhVfX0Jsb2JVcGxvYWRTZXNzaW9uX18YOAw 
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:245) 
at javax.mail.internet.MimeMultipart.parse(MimeMultipart.java:181) 
at javax.mail.internet.MimeMultipart.getCount(MimeMultipart.java:109) 
at com.google.appengine.api.blobstore.dev.UploadBlobServlet.handleUpload(UploadBlobServlet.java:146) 
at com.google.appengine.api.blobstore.dev.UploadBlobServlet.access$000(UploadBlobServlet.java:69) 
at com.google.appengine.api.blobstore.dev.UploadBlobServlet$1.run(UploadBlobServlet.java:112) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.google.appengine.api.blobstore.dev.UploadBlobServlet.doPost(UploadBlobServlet.java:109) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
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.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:110) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:61) 
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:125) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97) 
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) 

當我試圖上傳使用普通的css和jquery庫的簡單的JSP頁面時,一切都工作得很好。

<%@ page 
import="com.google.appengine.api.blobstore.BlobstoreServiceFactory"%> 
<%@ page import="com.google.appengine.api.blobstore.BlobstoreService"%> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<meta name="viewport" content="width=device-width, initial-scale=1.0"> 
<title>News App : Upload New News</title> 

<link href="/bootstrap/css/bootstrap-responsive.css" type="text/css" 
rel="stylesheet" /> 
<link href="/bootstrap/css/bootstrap.css" type="text/css" 
rel="stylesheet" /> 
<script src="http://code.jquery.com/jquery-1.8.2.min.js" 
type="text/javascript"></script> 
<script src="/bootstrap/js/bootstrap.js" type="text/javascript"></script> 
</head> 
<body> 
<% 
    BlobstoreService blobstoreService = BlobstoreServiceFactory 
      .getBlobstoreService(); 
%> 
<div class="container-fluid"> 
    <div class="row-fluid"> 
     <div class="span1"></div> 
     <div class="span10"> 
      <ul class="nav nav-tabs"> 
       <li><a href="/">Home</a></li> 
       <li class="active"><a href="/newpost">Post New Topic</a></li> 
      </ul> 
      <form method="POST" 
       action="<%=blobstoreService.createUploadUrl("/upload")%>" 
       id="uploadImageForm" enctype="multipart/form-data"> 
       <fieldset> 
        <legend class="text-info">Upload Form</legend> 
        <label for="newsTitle">News Title</label> <input type="text" 
         name="newsTitle" id="newsTitle" class="span12" 
         placeholder="Type some title..." /> 
        <div class="clear"></div> 
        <label for="newsDescription">News Description</label> 
        <textarea class="textarea span12" name="newsDescription" 
         id="newsDescription" placeholder="Type some description..." 
         style="height: 70px;"></textarea> 
        <div class="clear"></div> 
        <label for="newsPic">Choose Picture</label> <input type="file" 
         name="newsPic" id="newsPic" placeholder="Type some title..." /> 
        <div class="clear"></div> 
        <input type="submit" class="btn btn-success" value="Submit" /> 
       </fieldset> 
      </form> 
     </div> 
     <div class="span1"></div> 
    </div> 
</div> 

根本無法理解,爲什麼這個問題發生。我需要你的建議。

回答

2

也許這個問題與事實有關,默認情況下,jQuery Mobile使用AJAX提交表單。

爲了能夠通過添加 data-ajax=」false」數據屬性的<form>標籤來提交您的形式,而不使用AJAX,你可以將其禁用。

我希望這會有所幫助。

+1

基於http://view.jquerymobile.com/1.3.0/docs/widgets/forms/的底部,這看起來像是一個因素。 – 2013-02-24 03:53:12

+0

@Tolis非常感謝您的意見。它開始工作。 – 2013-02-24 07:49:17

+0

@AnkurJain不客氣。 – 2013-02-24 08:00:36

1

我懷疑Tolis在這方面有答案,所以我會在「我需要你的建議」部分採取行動。

這是一種真正有助於將失敗減少到最小可能測試用例的問題(或者至少比此更小的測試用例)。這有以下幾個方面的幫助:首先,它會經常導致您看到您可能已經做出的難以辨認的拼寫錯誤。 (如果我每次意外地輸入「multipart/form-date」時都有鎳......但是當有很多額外的混亂時,很難發現)。

其次,通過消除分心,試圖通過給他們少些無關緊要的東西來幫助你。第三,如果你確實發現了一個bug,一個簡單的測試用例大大提高了它很快得到修復的機會。

在這種特殊情況下,我嚴重懷疑,要麼springcss什麼與你所看到的行爲。非文件輸入字段也可以去,除非他們改變你看到的行爲。