Google app engine AppEngine-使用HTTP将文件发送到blobstore

Google app engine AppEngine-使用HTTP将文件发送到blobstore,google-app-engine,http,blobstore,Google App Engine,Http,Blobstore,我正在尝试使用http请求将文件发送到blobstore 首先,我制作了一个按钮来调用createUploadUrl以获取上传url 然后我做了一个客户: HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(URL_FROM_CREATEUPLOADURL); httpPost.setEntity(new StringEntity("value1")); HttpResponse h

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


我做错了什么?

听起来你好像在试图硬编码一个上传URL。你不能这样做-你需要为你想要上传的每个文件生成一个新的文件


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

显然,该实体必须是一个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();
这是客户端上载代码:

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);

这么简单…:(

Java API和概述:您好,尼克,您说得对,我想使用一个URL,我应该如何以友好的方式获取一个新的URL?调用servlet并在响应中返回它?有更好的方法吗?假设这是客户机代码,是的:创建一个servlet,在调用时返回上载URL,并使用它为每个文件获取一个新的URL。您好,尼克,我是g通过友好方式设置url,效果很好,thx。但是当我将请求发送到该url时,它会响应Java堆空间,并且不会到达createUploadUrl中指示的servlet。我将VM配置为-Xmx1024m或1536,两者都不起作用,我想这不是问题所在。还有什么可能?thx很多!!!@david我不确定是什么问题“响应Java堆空间"意思是,但如果这意味着你因为内存不足而出现异常,而这是在dev_appserver上,请记住,你不应该在dev中使用真正大的文件进行测试-它们在内存中进行缓冲,不像在生产中。很明显,此API是用于标准浏览器表单上载的,是吗?它们都不会使其成为e上传也不容易。它总是需要两个请求。通过服务器代码传递数据并发布可能是可能的,但失去了使用接收方代码的简单性。
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);