gpt4 book ai didi

java - 将图像解压缩到 blobstore

转载 作者:搜寻专家 更新时间:2023-11-01 03:43:38 29 4
gpt4 key购买 nike

在我的应用程序中,我需要执行以下操作:1. 将包含图像(目前只有 jpg)和其他内容的 zip 文件上传到 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);
}

最佳答案

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

改用下面的

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

希望对你有帮助

关于java - 将图像解压缩到 blobstore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8414452/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com