GAE Blobstore错误:NOT_FOUND servlet

时间:2014-08-26 21:14:51

标签: java google-app-engine servlets blobstore

我尝试使用BlobstoreService来将图像上传到我的应用程序。 根据GAE API,您应该如何做到这一点:

<form action="<%= blobstoreService.createUploadUrl("/upload") %>" method="post" enctype="multipart/form-data">
    <input type="file" name="myFile">
    <input type="submit" value="Submit">
</form>

我的问题是我不能使用JSP因为我使用phonegap来创建一个Android应用程序并且不支持JSP所以我以另一种方式执行此操作,我有一个servlet接收请求,生成URL和将请求转发到生成的URL,如下所示:

GetBlobstoreServiceUrlServlet:

String url = blobstoreService.createUploadUrl("/AddDogPictureServlet");
int ahUploadIndex = url.indexOf("/_ah/upload");
url = url.substring(ahUploadIndex);
ServletContext context = getServletContext();
RequestDispatcher rd = context.getRequestDispatcher(url);
rd.forward(request, response);

当我在本地计算机上运行它时,这非常有效,但是当我将其上传到GAE时,我得到了错误:NOT_FOUND&#34;只在这个servlet上。

我有其他血清,所有这些都很好。

我检查了web.xml文件并正确映射了servlet(否则它不能在本地工作):

<servlet>
    <servlet-name>GetBlobstoreServiceUrlServlet</servlet-name>
    <servlet-class>Servlets.BlobstoreServlets.GetBlobstoreServiceUrlServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>GetBlobstoreServiceUrlServlet</servlet-name>
    <url-pattern>/GetBlobstoreServiceUrlServlet</url-pattern>
</servlet-mapping>

有没有其他方法可以实现这一目标?

1 个答案:

答案 0 :(得分:0)

问题在于,在生产环境中,生成的blob上传Urls(createUploadUrl(..))位于与您的应用服务器分开的服务器上。 OTOH requestDispatcher.forward(..)仅在同一个servlet容器中工作。这适用于开发服务器,因为blob上传URL是在同一个servlet容器中模拟和运行的。

解决方案是:

  1. 通过Url Fetch转发整个请求(这会产生全新的传出Http请求)或
  2. 最好分两步上传:首先从服务器获取上传网址,然后将blob上传到该网址。