我遵循的步骤:
1)将图像存储在Blobstore中。(这是必要的) 2) 从blobstore中获取图像并将其保存到GCS存储桶中。
如果我将图像文件直接存储到 GCS 存储桶,那么它就可以正常工作。 但我想从 Blobstore 获取它。
Map<String, List<BlobInfo>> blobsData = blobstoreService.getBlobInfos(req);
for (String key : blobsData.keySet())
{
for(BlobInfo blob:blobsData.get(key))
{
byte[] b = new byte[(int)blob.getSize()];
BlobstoreInputStream in = new BlobstoreInputStream(blob.getBlobKey());
in.read(b);
GcsService gcsService = GcsServiceFactory.createGcsService();
GcsFilename filename = new GcsFilename("casfilestorage", blob.getFilename());
GSFileOptionsBuilder builder = new GSFileOptionsBuilder()
.setAcl("public_read")
.setBucket(BUCKET_NAME)
.setKey(blob.getFilename())
.setMimeType(blob.getContentType());
AppEngineFile writableFile = fileService.createNewGSFile(builder.build());
boolean lock = true;
writeChannel = fileService.openWriteChannel(writableFile, lock);
os = Channels.newOutputStream(writeChannel);
UploadOptions uploadOptions = UploadOptions.Builder.withGoogleStorageBucketName("casgaestorage");
//String uploadUrl = blobstoreService.createUploadUrl("/serve", uploadOptions);
os.close();
writeChannel.closeFinally();
in.close();
}
}
最佳答案
引用下面的代码,只需将您的 byte[] 传递给 write 方法:
GcsService f_ObjGcsService = GcsServiceFactory.createGcsService();
GcsFilename f_ObjFilename = new GcsFilename("BUCKET NAME", "FileName");
GcsFileOptions f_ObjOptions = new GcsFileOptions.Builder()
.mimeType("Content Type")
.acl("public-read")
.build();
GcsOutputChannel f_ObjWriteChannel = f_ObjGcsService.createOrReplace("Filename", f_ObjOptions);
PrintWriter f_ObjWriter = new PrintWriter(Channels.newWriter(f_ObjWriteChannel, "UTF8"));
f_ObjWriter.flush();
f_ObjWriteChannel.waitForOutstandingWrites();
f_ObjWriteChannel.write(ByteBuffer.wrap("Byte Array that u get from blob"));
f_ObjWriteChannel.close();
关于java - 将图像文件存储到 Google Cloud Storage Bucket 后,它会显示所有大小为 "0 bytes"的文件的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27012182/