【问题标题】:AppEngine - Send files to the blobstore using HTTPAppEngine - 使用 HTTP 将文件发送到 blobstore
【发布时间】:2011-06-06 17:02:45
【问题描述】:

我正在尝试使用 http 请求将文件发送到 blobstore。

首先我做了一个按钮来调用createUploadUrl来获取上传url。

然后我做了一个客户:

HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(URL_FROM_CREATEUPLOADURL);

httpPost.setEntity(new StringEntity("value1"));
HttpResponse httpResponse = httpClient.execute(httpPost);

但我有两个问题:

  • 在开发模式下:当我运行客户端时,它会响应“必须先调用 set*BlobStorage() 之一。”

  • 如果我上传应用程序:每次调用时 url 都会发生变化,所以当我运行客户端时,它会响应“HTTP/1.1 500 Internal Server Error”

我做错了什么?

【问题讨论】:

    标签: google-app-engine http blobstore


    【解决方案1】:

    听起来您正在尝试对单个上传 URL 进行硬编码。您不能这样做 - 您需要为每个要上传的文件生成一个新文件。

    您还需要确保将文件作为多部分消息上传,而不是使用格式编码或原始正文。我不熟悉 Java API,但看起来您正在设置请求的原始正文。

    【讨论】:

    • 嗨尼克,你是对的,我想使用一个单一的 URL,我应该如何获得一个新的动态?调用 servlet 并在响应中返回它?有更好的方法吗?
    • 假设这是客户端代码,是的:创建一个在调用时返回上传 URL 的 servlet,并使用它为每个文件获取一个新的 URL。
    • 嗨,尼克,我正在动态地获取网址,它工作正常,谢谢。但是,当我将请求发送到该 url 时,它会响应 Java Heap Space 并且它没有到达 createUploadUrl 中指示的 servlet。我将 VM 配置为 -Xmx1024m 或 1536,但也没有工作,我想这不是问题。还能是什么?非常感谢!!!
    • @david 我不确定“响应 Java 堆空间”是什么意思,但如果这意味着您因为内存不足而遇到异常,这是在 dev_appserver 上,请记住,您不应该在 dev 中使用非常大的文件进行测试 - 它们在内存中缓冲,这与生产中不同。
    【解决方案2】:

    显然实体必须是 MultiPartEntity。

    这是获取 URL 的客户端代码:

    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost(myDomain/mayServlet);
    HttpResponse httpResponse = httpClient.execute(httpPost);
    Header[] headers = httpResponse.getHeaders(myHeader);
    for (int i = 0; i < headers.length; i++) {
    Header header = headers[i];
    if(header.getName().equals(myHeader))
    uploadUrl = header.getValue();
    

    这是返回 URL 的服务器代码:

    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
    String uploadUrl = blobstoreService.createUploadUrl(requestHandlerServlet);
    resp.addHeader("uploadUrl", uploadUrl);
    

    这是客户端上传代码:

    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost(uploadUrl);
    MultipartEntity httpEntity = new MultipartEntity();
    ContentBody contentBody = new FileBody(new File("filePath/fileName"));
    httpEntity.addPart("fileKey", contentBody);
    httpPost.setEntity(httpEntity);
    HttpResponse httpResponse = httpClient.execute(httpPost);
    

    这么简单... :(

    【讨论】:

    • 很明显,这个 API 是用于标准浏览器表单上传的,对吧?它们既不便于上传,也不高效。它总是需要两个请求。通过服务器代码传递数据并发布它可能是可能的,但失去了使用其接收器代码的简单性。
    猜你喜欢
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 2012-07-24
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多