0

当我转到https://appengine.google.com/blobstore/时,我看到图片已上传(参见 blob 查看器)。

在产品模式下:

在 chrome 开发工具中,当我提交表单以上传图像时,我看到表单处于“ PENDING ”状态。这封邮件的目的是帮助我理解什么应该失败。在 Network 选项卡中,我有以下 Header :

要求

URL:http://www.mananaseguro.com/_ah/upload/AMmfu6aImWsEdAeiy_FVrscqQiRoRSvjK2QSX6thgKTaMk4nKLbiJg86RrocrzAqWj2X2vi1gKrY_Yvr2kSQNpFMwxBiUFa1Tk5oEVZGjhMm_9SavhOAjNoteylbfLT7aZ5dUYMaDR2N/ALBNUaYAAAAAUeJL86BP_9txQLF54r96AvYfm1Nuw90l/
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Content-Type:multipart/form-data; boundary=----WebKitFormBoundarymTEOMdBbtHBxoFJb
Origin:http://www.mananaseguro.com
Referer:http://www.mananaseguro.com/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36
Request Payload
------WebKitFormBoundarymTEOMdBbtHBxoFJb
Content-Disposition: form-data; name="myFile"; filename="trailer-8.webp"
Content-Type: image/webp
------WebKitFormBoundarymTEOMdBbtHBxoFJb--

在响应选项卡中:

**This request has no data response**

我已经完成了以下 servlet 配置 (GUICE) serve("/_ah/upload").with(BlobstoreUploadFinishedServlet.class); // post serve("/_ah/serve").with(Servlet_Serve.class);

我称之为一些相关的代码行:

resp.sendRedirect("/_ah/serve?blob-key=" + url);

字符串 url = blobstoreService.createUploadUrl("/_ah/upload");

问题:您能解释一下为什么“我”没有回复(表单 POST 始终处于待处理状态)吗?我也不知道我是否应该使用“/_ah/”(我决定把它放在任何地方)?


我在开发模式下遇到另一个问题,我无法测试上传到 blobstore,因为我有以下错误:

警告:com.google.appengine.api.blobstore.dev.UploadBlobServlet.getSessionId(UploadBlobServlet.java:134) 处的 /_ah/upload/ag1tYW5hbmFzZWd1cm8xch0LEhVfX0Jsb2JVcGxvYWRTZXNzaW9uX18Y2aQCDA java.lang.NullPointerException

问题:发生了什么?这是与cookie有关的问题吗?

谢谢,

4

1 回答 1

2

我记得不久前处理过这个问题 - 遗憾的是,这是因为 devmode 中的 blobstore 实现与生产中的不同。

你不需要 /_ah/ 前缀,如果我没记错的话, /_ah/upload 是为 blobservice 保留的,所以你不应该使用它。(不要相信我的话)

这远非最佳,但您可以通过调用实用程序函数了解您是否在服务器端处于开发模式:

public static boolean isDevelopmentMode() {
    return ( SystemProperty.environment.value() ==
                SystemProperty.Environment.Value.Development );
}

并通过调用 resp.sendRedirect("devmodeServe?blob-key="+blobkey); 实现不同的逻辑 并将该 servlet 绑定到 DevmodeServeServlet 类:

class DevmodeServeServlet extends HttpServlet
{
         BlobstoreService blobstoreService = BlobstoreServiceFactory
        .getBlobstoreService();

        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {

            BlobKey blobKey = new BlobKey(req.getParameter("blob-key"));
            blobstoreService.serve(blobKey, resp);

        }
}

我也不记得为什么,但我认为您必须在浏览器地址栏中使用您的计算机名称而不是 127.0.0.1 或 localhost(您可能需要将其添加到您的 gwt devmode 插件中的允许列表中浏览器)

于 2013-07-15T22:05:12.213 回答