我目前正在开发一款需要将图像传递到App引擎后端的应用程序。最初我计划直接通过端点发送图像(它们只有很小 - 最大100kb - 平均20kb)但是当通过端点将数据作为字节数组发送时,我收到一个JSON错误(来自其余的API),说明数据有一个无效的字符。有办法解决这个问题吗?
我的第二次尝试是使用BlobService并使用以下代码将上传URL返回给客户端:
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
UploadOptions uploadOptions = UploadOptions.Builder.withGoogleStorageBucketName("bucketname").maxUploadSizeBytes(1048576);
String url = blobstoreService.createUploadUrl("/uploaded", uploadOptions);
然后在Android设备上使用HTTP帖子上传图片:
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
entity.addPart("data", new ByteArrayBody(data,"image/png","img.png"));
httppost.setEntity(entity);
String res = EntityUtils.toString( httpclient.execute(httppost).getEntity(), "UTF-8");
这似乎有效并且图像已上传。但是,我不知道如何获取此上传图像的blobkey。有人知道吗?此外,HTTP帖子的结果是404错误 - 因为“/ uploaded”页面不存在我猜?
第三,当手动输入blobkey并使用它返回并使用以下代码对服务URL进行映像时:
private String getImage(){
return getThumbUrl(new BlobKey("encoded_gs_key:ZGNpbWcxMy93czZwZ2lUeXdpY0xvZ2xtZGpHZ2dn"));
}
private String getThumbUrl(BlobKey blobkey){
ServingUrlOptions options = ServingUrlOptions.Builder.withBlobKey(blobkey);
try {
return ImagesServiceFactory.getImagesService().getServingUrl(options);
} catch(IllegalArgumentException e) {
e.printStackTrace();
return null;
} catch(ImagesServiceFailureException e) {
e.printStackTrace();
return null;
}
}
我收到了图片的网址,但图片颜色全部搞砸了。我正在上传索引的png ...我不确定ImageService是否可以正确处理它们。如果它不能,我如何直接提供图像,即不通过ImageService,而是通过BlobstoreService.serve()?
以下是来自ImageService网址的结果图片的图片:http://i.imgur.com/EhfkJ9j.png
干杯, 本
答案 0 :(得分:0)
关于blob键,当您创建上传URL时,您传递的参数包含上传后调用的appengine页面的名称。您需要实现该页面(“已上传”)https://developers.google.com/appengine/docs/java/blobstore/#Java_Uploading_a_blob