2011-01-10 74 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

相關問題