2

我目前正在开发一个应用程序,该应用程序需要将图像传入和传出应用程序引擎后端。最初我计划直接通过端点发送图像(它们很小 - 最大 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

干杯,本

4

1 回答 1

0

关于 blob 键,当您创建上传 url 时,您会传递一个参数,其中包含上传后调用的 appengine 页面的名称。您需要实现该页面(“上传”)https://developers.google.com/appengine/docs/java/blobstore/#Java_Uploading_a_blob

于 2013-11-14T02:24:29.040 回答