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 Internal Server Error”

我做错了什么?

4

2 回答 2

5

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

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

于 2011-01-11T01:23:49.713 回答
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);

太简单... :(

于 2011-01-13T06:18:37.063 回答