我目前正在开发一个应用程序,该应用程序需要将图像传入和传出应用程序引擎后端。最初我计划直接通过端点发送图像(它们很小 - 最大 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 post 上传图片:
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;
}
}
我收到了图像的 URL,但是图像颜色都搞砸了。我正在上传索引的 png... 我不确定 ImageService 是否可以正确处理它们。如果不能,我该如何直接提供图像,即不通过 ImageService 而是通过 BlobstoreService.serve()?
这是来自 ImageService URL 的结果图片的图像:http: //i.imgur.com/EhfkJ9j.png
干杯,本