2

我正在编写一个应用程序,用户可以在其中将图片从 gae 上传到云存储。上传有点棘手,因为我必须将上传的文件转换为字节格式。我遵循了下一个教程: 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)

现在我必须重命名一些文件夹/图像。我阅读了有关它的相关文档,并尝试阅读原始文件并将其重写到新位置。但是我在将文件读取为字节文件并重写它时遇到了很多问题(我想我必须读取为字节文件)。

我的最后一次尝试是这样的:

  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 个字节。有任何想法吗?

4

2 回答 2

0

您确定您的读取成功并且数据如您所愿吗?从其文档FileReadChannel中继承read()方法说:ReadableByteChannel

返回:
读取的字节数,可能为零,如果通道已到达流尾,则为 -1

您的代码没有检查read()equals的返回值,fileSize因此错误可能存在,如果缓冲区为空,它将解释您的代码创建空文件的原因。

另外,这一行:

// readChannel.close() comment because fails to close the file.

令人担忧,因为它表明存在其他问题,因为它不应该失败。您尝试读取的文件是否 (a) 可读且 (b) 已完成?


另外,正如大卫在另一个答案中提到的那样,您使用的 Files API 已被弃用

弃用通知:文件 API 功能将在未来某个时间被移除,取而代之的是Google Cloud Storage Client Library。为方便仍在使用 Files API 的开发人员,保留了已弃用 API 的文档。

因此,按照说明的建议,请参阅Google Cloud Storage Java 客户端库并查看迁移页面,了解从已弃用的 API 调用到新调用的映射,其中包括一个完整的迁移示例,在这种情况下应该会对您有所帮助。

于 2014-05-24T01:24:13.397 回答
0

FileService弃用。查看 Cloud Storage API,objects.copy您可以使用一种方法。

然后,您必须使用objects.delete.

于 2014-05-21T13:13:29.550 回答