我正在使用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时似乎无法实现。
有什么想法吗?
答案 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
使用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();