我正在编写一个应用程序,用户可以从gae将图片上传到cloudstorage。上传有点棘手,因为我必须将上传的文件转换为字节格式。我按照下一个教程: https://developers.google.com/appengine/docs/java/googlestorage/overview
我只替换了
writeChannel.write(ByteBuffer.wrap
("And miles to go before I sleep.".getBytes()));
与
ByteBuffer buffer = ByteBuffer.wrap(IOUtils.toByteArray(file.getInputStream))
writeChannel.write(buffer)
现在我必须重命名一些文件夹/图像。我阅读了有关它的相关文档,我尝试阅读原始文件并在新位置重写它。但是我有很多问题要把文件读成bytefile,然后重写它(我想我必须读作bytefile)。
我的最后一次尝试是这样的:
public void copyFile(String from,String to) {
FileService fileService = FileServiceFactory.getFileService
AppEngineFile readableFile = new AppEngineFile(from)
readChannel = fileService.openReadChannel(readableFile,true)
int fileSize = fileService.stat(readableFile).getLength.intValue()
LOG.info("Size int " + fileSize)
ByteBuffer dst = ByteBuffer.allocate(fileSize)
readChannel.read(dst)
//readChannel.close() comment because fails to close the file.
GSFileOptionsBuilder optionsBuilder = new GSFileOptionsBuilder()
.setBucket("bucket_name")
.setKey(to)
.setAcl("public_read")
AppEngineFile writableFile = fileService.createNewGSFile(optionsBuilder.build())
val writeChannel = fileService.openWriteChannel(writableFile, true)
// This time we write to the channel directly.
writeChannel.write(dst)
// Now finalize
writeChannel.closeFinally()
readChannel.close()
}
当我使用这个方法时,它会写入文件,但是有0个字节。有什么想法吗?
答案 0 :(得分:0)
不推荐使用FileService
。查看Cloud Storage API,您可以使用objects.copy
方法。
然后,您必须使用objects.delete
删除该文件。
答案 1 :(得分:0)
您确定您的阅读成功并且数据是否符合预期? FileReadChannel
继承了ReadableByteChannel
的read()
方法,其文档为:
返回:
读取的字节数,可能为零,如果通道已到达流末尾,则为-1
您的代码未检查read()
的返回值是否等于fileSize
,因此错误可能存在,如果缓冲区为空,则可以解释您的代码创建空文件的原因。
此外,这一行:
// readChannel.close() comment because fails to close the file.
令人担忧,因为它表明存在其他问题,因为它不应该失败。您尝试阅读的文件(a)是否可读,(b)最终确定?
另外,正如David中提到的another answer,您使用的文件API是deprecated:
弃用通知:文件API功能将在以后的某个时间删除,取而代之的是Google Cloud Storage Client Library。为了方便仍在使用Files API的开发人员,保留了已弃用API的文档。
因此,正如说明所示,请参阅Google Cloud Storage Java Client library并查看migration page,了解从已弃用的API调用到新调用的映射,其中包括一个完整的迁移示例,该示例可以帮助您在这种情况下。