从gae中移动cloudstorage中的文件

时间:2013-03-12 19:02:34

标签: java google-app-engine google-cloud-storage

我正在编写一个应用程序,用户可以从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个字节。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

不推荐使用FileService。查看Cloud Storage API,您可以使用objects.copy方法。

然后,您必须使用objects.delete删除该文件。

答案 1 :(得分:0)

您确定您的阅读成功并且数据是否符合预期? FileReadChannel继承了ReadableByteChannelread()方法,其文档为:

  

返回:
  读取的字节数,可能为零,如果通道已到达流末尾,则为-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调用到新调用的映射,其中包括一个完整的迁移示例,该示例可以帮助您在这种情况下。