使用适用于Google云端存储的客户端库进行可恢复上传

时间:2016-03-03 16:30:22

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

早些时候,我问了一个问题https://stackoverflow.com/questions/35581090/can-i-use-resumable-upload-for-gae-blobstore-api 关于使用Blobstire API进行可恢复上传的信息。 对于我自己,我决定用Blobstire API实现可恢复的上传是不可能的。 在这种情况下,我正在尝试使用Java客户端库实现Google云端存储。目前我将我的视频文件下载到存储桶并提供视频。我的servlet看起来像谷歌示例

   @Override
  public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    GcsOutputChannel outputChannel =
        gcsService.createOrReplace(getFileName(req), GcsFileOptions.getDefaultInstance());
    copy(req.getInputStream(), Channels.newOutputStream(outputChannel));
  }

  private GcsFilename getFileName(HttpServletRequest req) {
    String[] splits = req.getRequestURI().split("/", 4);
    if (!splits[0].equals("") || !splits[1].equals("gcs")) {
      throw new IllegalArgumentException("The URL is not formed as expected. " +
          "Expecting /gcs/<bucket>/<object>");
    }
    return new GcsFilename(splits[2], splits[3]);
  }

  private void copy(InputStream input, OutputStream output) throws IOException {
    try {
      byte[] buffer = new byte[BUFFER_SIZE];
      int bytesRead = input.read(buffer);
      while (bytesRead != -1) {
        output.write(buffer, 0, bytesRead);
        bytesRead = input.read(buffer);
      }
    } finally {
      input.close();
      output.close();
    }
  }

现在我需要实施

  • 可恢复上传(由于移动设备上的互联网状况不佳)
  • 按chunck上传(由于一个请求的大小限制为32mb)

我意识到,应该手动组织可恢复上传的服务器端,我的后端应该能够给我一系列上传的chunck并允许继续启动到OutputChannel。

GcsOutputChannel的文档说:

  

这个类是可序列化的,这允许写一部分文件,   序列化GcsOutputChannel反序列化它,并继续   写入同一个文件。序列化实例的时间   有效期受Google云端存储服务的限制和确定

我没有足够的经验,所以问题可能是愚蠢的: 请有人告诉我如何序列化我的GcsOutputChannel?我不明白我可以在哪里保存包含序列化对象的文件。

顺便说一句,任何人都可以知道Google云端存储服务存储序列化对象的时间有多长?

1 个答案:

答案 0 :(得分:1)

您可以使用任何Java序列化方法(通常使用ObjectOutputStream)序列化GcsOutputChannel。如果您在AE上运行,您可能希望将该序列化字节保存在数据存储区中(作为数据存储区Blob)。有关如何将序列化对象转换为字节数组的信息,请参阅此link