使用ImagesService转换上传的图片后,我想将其存储回新的Blob文件,并通过ImagesService提供的getServingUrl()
提供。
按照描述here将图像存储在新的AppEngineFile中工作正常,我可以使用开发服务器在本地打开和查看它。
但是,当将新的AppEngineFile的blobKey传递给ImagesService.getServingUrl()
时
java.lang.IllegalArgumentException:无法读取blob。
异常被抛出。任何想法可能是什么问题?这是我用来转换和存储上传图像的代码(blobKey和blobInfo对应于上传的文件,而不是新创建的文件)。
/* Transform image in existing Blob file */
Image originalImage = ImagesServiceFactory.makeImageFromBlob(blobKey);
Transform verticalFlip = ImagesServiceFactory.makeVerticalFlip();
ImagesService imagesService = ImagesServiceFactory.getImagesService();
Image newImage = imagesService.applyTransform(verticalFlip, originalImage);
/* Store newImage in an AppEngineFile */
FileService fileService = FileServiceFactory.getFileService();
AppEngineFile file = fileService.createNewBlobFile(blobInfo.getContentType());
FileWriteChannel writeChannel = fileService.openWriteChannel(file, true);
ByteBuffer buffer = ByteBuffer.wrap(newImage.getImageData());
writeChannel.write(buffer);
/* closeFinally assigns BlobKey to new file object */
writeChannel.closeFinally();
BlobKey newBlobKey = fileService.getBlobKey(file);
修改
上面的代码是正确的,问题是使用newBlobKey.toString()
而不是newBlobKey.getKeyString()
存储新blob密钥的String表示。
答案 0 :(得分:0)
你为什么要那样做?转换图像后,它会被缓存,无论如何它总是很快。如果你真的觉得要保存它,只需使用urlfetch读取数据并将它们存储在BlobStore中; - )
答案 1 :(得分:0)
在问题中发布的代码末尾执行以下工作正常:
String url = imagesService.getServingUrl(newBlobKey)
然后,可以使用URL按照文档中的说明缩放和裁剪新图像 http://code.google.com/appengine/docs/java/images/overview.html#Transforming_Images_from_the_Blobstore