如何将getServingUrl用于保存在Google Cloud Store中的文件?

时间:2016-03-24 01:24:31

标签: java google-app-engine google-cloud-storage

我正在使用AppEngine(Java)和Google Cloud Storage。该文件由应用程序保存在存储桶中(我已经验证它可以正常工作)。以下是我尝试获取服务网址的方法:

filePath = "/gs/"+BUCKET_NAME+"/"+filename;
ServingUrlOptions options = ServingUrlOptions.Builder.withGoogleStorageFileName(filePath);
servingUrl = ImagesServiceFactory.getImagesService().getServingUrl(options);

我所得到的错误并没有多说:

com.google.appengine.api.images.ImagesServiceFailureException: 
at com.google.appengine.api.images.ImagesServiceImpl.getServingUrl(ImagesServiceImpl.java:284)

文件路径是正确的(我已经检查过了,当它没有得到"找不到文件"错误时)。

以下结果导致相同的结果:

BlobKey blobKey = blobstoreService.createGsBlobKey(filePath);
ServingUrlOptions options = ServingUrlOptions.Builder.withBlobKey(blobKey);
ImagesServiceFactory.getImagesService().getServingUrl(options);

我使用云存储(而不是blobstore),因为我希望能够设置文件和"文件夹"名称,使用blobstoreService.createUploadUrl时似乎无法实现。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

即使您将blob存储在存储桶中,也需要使用blobkey来提供图像。下面是为我工作的代码片段。

  

使用Blobstore

            BlobInfoFactory blobInfoFactory = new BlobInfoFactory();
            BlobInfo info = blobInfoFactory.loadBlobInfo(blobKey);
            ImagesService services = ImagesServiceFactory.getImagesService();
            ServingUrlOptions serve = ServingUrlOptions.Builder.withBlobKey(blobKey);
            String imageUrl = services.getServingUrl(serve); // This will give u image URL

您还可以在我已经在stackoverflow上发布的三个答案中找到更多详细信息

upload a file using spring MultipartFile and google app engine

File missing in Google Cloud Storage on AppEngine after following instructions

How can I upload an thumbnail image (blob) at the same time as an Entity into a datastore in google app engine?

  

使用GAE Bucket

UploadOptions uploadOptions = UploadOptions.Builder.withGoogleStorageBucketName(bucketName); // eg. mybucket

以下内容将返回将blob文件上传到GAE Bucket的URL。在这里,您需要上传blob内容或图像。

String uploadUrl = blobstoreService.createUploadUrl("http://xxx.appspot.com/imageupload", uploadOptions);

使用blobkey提供图片

BlobInfoFactory blobInfoFactory = new BlobInfoFactory();
BlobInfo info = blobInfoFactory.loadBlobInfo(blobKey);
ImagesService services = ImagesServiceFactory.getImagesService();
ServingUrlOptions serve = ServingUrlOptions.Builder.withBlobKey(blobKey);
String imageUrl = services.getServingUrl(serve);

答案 1 :(得分:0)

原来问题中的代码没有问题。除了主要内容之外,在GCS中保存的文件还包括一些元数据。所以,我需要使用Apache Commons FileUpload从负载中提取图像:

file = new ServletFileUpload().getItemIterator(request).next().openStream();