【问题标题】:GAE Blobstore Exception in jQuery MobilejQuery Mobile 中的 GAE Blobstore 异常
【发布时间】:2013-02-09 05:54:52
【问题描述】:

当我使用jQuery Mobile 1.3.0 设计我的blobstore upload form JSP 页面时,我遇到了一个非常不寻常的问题。我在下面发布代码。

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

根本无法理解为什么会出现这个问题。我需要你的建议。

【问题讨论】:

    标签: jquery spring google-app-engine jquery-mobile blobstore


    【解决方案1】:

    也许问题与默认情况下 jQuery Mobile 使用 AJAX 提交表单有关。

    为了能够在不使用 AJAX 的情况下提交表单,您可以通过添加 data-ajax=”false” 数据属性到&lt;form&gt; 标签。

    我希望这会有所帮助。

    【讨论】:

    【解决方案2】:

    我怀疑 Tolis 对此有答案,所以我将尝试“我需要你的建议”部分。

    这种问题确实有助于将故障减少到尽可能小的测试用例(或至少比这更小的测试用例)。这在几个方面有所帮助:首先,它通常会引导您看到您可能制作的难以发现的错字。 (如果我每次不小心输入“multipart/form-date”时都得到一个镍币……但是当有很多额外的混乱时,这很难发现。)

    其次,通过消除干扰,它可以帮助那些试图帮助你的人,让他们少一些无关紧要的东西让他们涉水而过。

    第三,如果你确实发现了一个错误,一个简单的测试用例会大大提高它被快速修复的机会。

    在这种特殊情况下,我严重怀疑springcss 与您所看到的行为有任何关系。非文件输入字段也可能消失,除非它们改变了您所看到的行为。

    【讨论】:

      猜你喜欢
      • 2012-02-06
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      • 2012-10-12
      • 2015-05-22
      相关资源
      最近更新 更多