AppEngine - 使用HTTP将文件发送到Blobstore

4

我正在尝试使用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内部服务器错误”。

我做错了什么?

2个回答

5

显然,实体必须是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是为标准浏览器表单上传而设计的,对吧?它们既不容易也不高效地上传。它总是需要两个请求。通过服务器代码传递数据并发布可能是可能的,但会失去使用其接收器代码的简单性。 - lilbyrdie

5

看起来你正在尝试硬编码一个单独的上传URL。这是不行的 - 你需要为每个要上传的文件生成一个新的URL。

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


Java APIs和概述:http://code.google.com/appengine/docs/java/blobstore/overview.html - Stephen Denne
嗨,尼克,你说得对,我想使用一个单一的URL,我应该如何动态获取一个新的URL?调用一个servlet并在响应中返回它吗?有更好的方法吗? - david
假设这是客户端代码,可以创建一个servlet,在调用时返回上传URL并使用它来获取每个文件的新URL。 - Nick Johnson
嗨Nick,我正在动态获取URL,它运行良好,谢谢。但是当我向该URL发送请求时,它会响应Java Heap Space,并且无法到达createUploadUrl中指定的servlet。我将VM配置为-Xmx1024m或1536,但也没有起作用,我认为这不是问题所在。还有什么可能呢?非常感谢! - david
@nick,非常抱歉浪费了您的时间,这是我的错。我一直在发送错误的实体(如StringEntity)进行测试。现在我已经发送了一个文件,它运行得很好。不过还是非常感谢您的帮助,非常有帮助。 - david
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接