【问题标题】:unzipping images into blobstore将图像解压缩到 blobstore
【发布时间】:2012-01-14 21:55:13
【问题描述】:

在我的应用程序中,我需要执行以下操作: 1. 一个带有图片的 zip 文件(现在只有 jpgs)和其他东西被上传到 BlobStore。 2. 应用引擎后端应从上传的 zip 中读取条目,并将在其中找到的所有图像作为独立文件保存到 BlobStore。

我在 blobstore 上成功上传、解压缩和保存文件,但图像似乎损坏了。 当我从 BlobStore 下载它们(只是 blobstoreService.serve 它们)时,图像颜色错误,或部分显示,或以其他方式损坏。尝试使用 ImagesService 也会引发异常。我在压缩图像之前检查了图像的大小,以及在写入 blobstore 时解压缩的文件的大小,它们看起来相同。这是我的代码:

ZipInputStream zis = ...; 
ZipEntry entry;
while ((entry =zis.getNextEntry()) !=null)
{
    String fileName = entry.getName().toLowerCase();
    if(fileName.indexOf(".jpg") != -1 || fileName.indexOf(".jpeg") != -1)       
     {
        FileService fileService = FileServiceFactory.getFileService();
        String mime = ctx.getMimeType(fileName);//getting mime from servlet context
        AppEngineFile file = fileService.createNewBlobFile(mime, fileName);
        boolean lock = true;
        FileWriteChannel writeChannel = fileService.openWriteChannel(file, lock);
        byte[] buffer = new byte[BlobstoreService.MAX_BLOB_FETCH_SIZE];
        while(zis.read(buffer) >= 0)
        {
           ByteBuffer bb = ByteBuffer.wrap(buffer);
           writeChannel.write(bb);
        }
        writeChannel.closeFinally();
        BlobKey coverKey =  fileService.getBlobKey(file);
        ....
     }
}

非常感谢您的宝贵时间!

UPD:我找到了一个可行的解决方法,但我仍然不明白为什么第一个解决方案失败了。

            int read;
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            while((read = zis.read()) >= 0)
            {
                baos.write(read);
                if(baos.size() == BlobstoreService.MAX_BLOB_FETCH_SIZE)
                {
                    ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray());
                    writeChannel.write(bb);
                    baos = new ByteArrayOutputStream();
                }
            }
            if(baos.size() > 0)
            {
                ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray());
                writeChannel.write(bb);
            }

【问题讨论】:

  • 尝试将原始图像的实际内容与下载的图像进行比较 - 它们有何不同?

标签: java google-app-engine blobstore


【解决方案1】:

因为 zis.read(buffer) 可能不会填满整个缓冲区。

改用以下

int len;
while((len = zis.read(buffer)) >= 0){
  ByteBuffer bb = ByteBuffer.wrap(buffer, 0, len);
  writeChannel.write(bb);
}

希望有帮助

【讨论】:

    猜你喜欢
    • 2013-08-07
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多