Создайте URL для обслуживания изображений для нового файла Blob - PullRequest
2 голосов
/ 21 июня 2011

После использования ImagesService для преобразования загруженного изображения я хотел бы сохранить его обратно в новый файл Blob и сделать его доступным через getServingUrl(), как это предусмотрено ImagesService.

Сохранение изображения вновый AppEngineFile, как описано здесь , работает нормально, и я могу открыть и просмотреть его локально с помощью сервера dev.

Однако при передаче blobKey для нового AppEngineFile в ImagesService.getServingUrl() a

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);

Редактировать:

Приведенный выше код является верным, проблема заключалась в сохранении строкового представления нового ключа BLOB-объекта с использованием newBlobKey.toString() вместо newBlobKey.getKeyString().

Ответы [ 2 ]

0 голосов
/ 08 июля 2011

Следующее прекрасно работает, когда выполняется в конце кода, размещенного в вопросе:

String url = imagesService.getServingUrl(newBlobKey)

Затем URL можно использовать для масштабирования и обрезки нового изображения, как описано в документации http://code.google.com/appengine/docs/java/images/overview.html#Transforming_Images_from_the_Blobstore

0 голосов
/ 08 июля 2011

Почему вы хотите это сделать?Как только вы преобразуете изображение, оно кэшируется и в любом случае оно всегда быстрое.Если вы действительно хотите сохранить его, просто используйте urlfetch, чтобы прочитать данные и сохранить их в BlobStore; -)

...