Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Google App Engine中存储旋转/翻转的图像_Java_Google App Engine_Google Cloud Storage_Blobstore - Fatal编程技术网

Java 在Google App Engine中存储旋转/翻转的图像

Java 在Google App Engine中存储旋转/翻转的图像,java,google-app-engine,google-cloud-storage,blobstore,Java,Google App Engine,Google Cloud Storage,Blobstore,我正在尝试旋转/翻转谷歌云存储中已经存在的图像 这是blobkey: BlobKey blobKey = new BlobKey(upload.getBlobKey()); 然后检索图像并应用图像变换: ImagesService imagesService = ImagesServiceFactory.getImagesService(); Image image = ImagesServiceFactory.makeImageFromBlob(blobKey); Transform tra

我正在尝试旋转/翻转谷歌云存储中已经存在的图像

这是blobkey:

BlobKey blobKey = new BlobKey(upload.getBlobKey());
然后检索图像并应用图像变换:

ImagesService imagesService = ImagesServiceFactory.getImagesService();
Image image = ImagesServiceFactory.makeImageFromBlob(blobKey);
Transform transform = ImagesServiceFactory.makeRotate(90);
Image newImage = imagesService.applyTransform(transform, image);
我可以使用以下方法在字节数组中获取原始图像数据:

newImage.getImageData()
直接使用GCS,我可以将其写入云存储服务:

GcsFilename fileName = new GcsFilename("bucket-name", upload.getFileName());
GcsOutputChannel outputChannel = GcsServiceFactory.createGcsService().createOrReplace(fileName, GcsFileOptions.getDefaultInstance());
outputChannel.write(ByteBuffer.wrap(newImage.getImageData()));
outputChannel.close();
在本地,我可以看到位于appengine生成的文件夹中的旋转图像,如何获取新的服务url,或者objectName应该是什么来覆盖原始图像?objectName是否与上载时的原始文件名相同,是否为blobkey

更新:

  Map<String,List<BlobInfo>> uploadInfos = getFileInfos(httpServletRequest);
  String theGCSFilename = uploadInfos.get("yourFileName").getGsObjectName();
上传时我正在存储GcsFilename:

BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
Map<String,List<FileInfo>> finfos = blobstoreService.getFileInfos(req);
String gcsFileName = finfos.get("uploadKey").get(0).getGsObjectName();
upload.setGcsFileName(gcsFileName);
upload.persist();
当我使用bk.getKeyString()打印新的blobKey时,会得到一个巨大的blobKey:

编码密钥:L2DZL2F1Y3RPB24TCG9YDGFSLxVWbG9HZHMVzMfRzLbMnVzKx2DzX2tLetPzWzQzedDMJPMxDIM0OWW3K4NfNyCdVwR3BjVvDSWLNewTvYMVL0Y2S1VgHdFitMgy5NjLmW0ZJJuzTaxNdCdZMyWyWyWyWyWmMzHmWe

当我尝试时:

imagesService.getServingUrl(ServingUrlOptions.Builder.withBlobKey(bk);
我现在得到一个无效的\u BLOB\u键:无法读取BLOB。

同:

imagesService.getServingUrl(ServingUrlOptions.Builder.withGoogleStorageFileName(fileName.getObjectName()));
无效的\u BLOB\u键:无法读取BLOB。

更新-现场测试:

  Map<String,List<BlobInfo>> uploadInfos = getFileInfos(httpServletRequest);
  String theGCSFilename = uploadInfos.get("yourFileName").getGsObjectName();
我已经在live上做了一些登录,看看是否可以确定哪里出了问题

当我打印出GcsFilename时,我得到的是:

GcsFilename fileName = new GcsFilename("bucket-name", upload.getGcsFileName());
System.out.println("fileName.getObjectName(): " + fileName.getObjectName());
System.out.println("fileName.getBucketName(): " + fileName.getBucketName());

2014-03-08 09:31:35.076 [s~_____/live-1-0-2.374269833496060124].<stdout>: fileName.getObjectName(): /gs/bucket-name/L2FwcGhvc3RpbmdfcHJvZC9ibG9icy9BRW5CMlI 
2014-03-08 09:31:35.076 [s~_____/live-1-0-2.374269833496060124].<stdout>: fileName.getBucketName(): bucket-name
Google存储文件名必须以/gs作为前缀/

有什么想法吗

解决方案

使用以下方法检索blobKey:

BlobKey blobKey = blobstoreService.createGsBlobKey("/gs/" + fileName.getBucketName() + "/" + fileName.getObjectName());
。。。即使fileName.getObjectName()在objectname前面已经包含“/gs/bucket name/”。在将其打印到标准输出时,文件名应该包含/gs/bucket name/两次,这很奇怪,但它可以工作


使用该blobKey,将创建正确的服务URL

要覆盖原始图像,只需指定相同的云存储文件名即可

我知道您已经通过应用程序引擎通过BlobStore API将图像上传到云存储。要获取原始图像的实际文件名,必须在上载servlet中添加以下代码:

  Map<String,List<BlobInfo>> uploadInfos = getFileInfos(httpServletRequest);
  String theGCSFilename = uploadInfos.get("yourFileName").getGsObjectName();
  • 创建一个自定义的
    GCSServingServlet
    ,该用户将使用
    BlobstoreService.service()
    方法为Blobstore或云存储中的文件提供服务。在这种情况下,您必须自己检查权限。请注意,您可以使用
    BlobStoreService.createGSBlobKey()
    GCSFilename
    创建
    BlobKey

  • 使用云存储服务URL:

    • 私人:
    • 公众:

  • 我已经用代码片段更新了问题,我被困在哪里,感觉就快到了。嗨,简。从“假编码密钥”我知道你在本地开发服务器上进行测试。一些地面军事系统和图像服务功能在那里不可用。您是否对GAE生产应用程序进行了相同的测试?旋转后的图像写入的位置不正确,如果我可以修复,则旋转将是100%,我已更新了问题。嘿,Jan,“getObjectName()”不应返回存储桶名称,也不应返回开头的“/gs”。您确定日志输出的是对象名而不是toString()方法的结果吗?getObjectName和getBucketName都返回字符串类型,并且objectName具有/gs/bucket name/。。。在调试模式下运行时,即使在本地,也在名称前面。我已经按照谷歌文档的建议做了,并在它前面加了另一个/gs/bucket name/,现在我可以旋转并存储一次图像,第二次旋转不起作用,但这将进一步研究。谢谢你的帮助!!感谢上面列出的解决方案!对于类似的问题,它也适用于我。
    BlobKey blobKey = blobstoreService.createGsBlobKey("/gs/" + fileName.getBucketName() + "/" + fileName.getObjectName());
    
      Map<String,List<BlobInfo>> uploadInfos = getFileInfos(httpServletRequest);
      String theGCSFilename = uploadInfos.get("yourFileName").getGsObjectName();
    
    ImagesService imagesService = ImagesServiceFactory.getImagesService();
    String url = imagesService.getServingUrl(ServingUrlOptions.Builder.withGoogleStorageFileName(java));