2011-01-10 58 views
4

我试图使用http请求将文件发送到Blob存储区。AppEngine - 使用HTTP将文件发送到Blob存储区

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

然后我做了一个客户端:

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

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

但我有2个问题:

  • 在开发模式:当我运行客户对此的反应“必须调用集合的一个* BlobStorage( )先。“

  • 如果我上传应用程序:变更网址我每次调用它,所以当我运行客户对此的反应“HTTP/1.1 500内部服务器错误”

我在做什么错?

回答

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

这是服务器代码返回的网址:

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

那么容易...... :(

5

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

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

+0

Java API和ove rview:http://code.google.com/appengine/docs/java/blobstore/overview.html – 2011-01-11 01:37:52

+0

嗨,尼克,你是对的,我想用一个URL,我应该如何得到一个新的dinamically?调用一个servlet并在响应中返回它?有一个更好的方法? – david 2011-01-11 14:05:49

相关问题