使用适用于 Google Cloud Storage 的客户端库进行断点续传



早些时候,我问了一个问题 https://stackoverflow.com/questions/35581090/can-i-use-resumable-upload-for-gae-blobstore-api关于使用 Blobstire API 的可恢复上传。就我自己而言,我决定不可能使用 Blobstire API 实现可恢复上传。在这种情况下,我正在尝试使用Java客户端库实现Google Cloud Storage。目前,我将视频文件下载到存储桶并提供视频。我的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 请求的大小限制)

我意识到,断点续传的服务器端应该手动组织,我的后端应该能够给我上传的 chuck 范围,并允许继续启动到 OutputChannel。

GcsOutputChannel 的文档说:

此类是可序列化的,这允许写入文件的一部分, 序列化 GcsOutputChannel 对其进行反序列化,并继续 写入同一文件。序列化实例的时间 有效性有限,由谷歌云存储服务决定

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

顺便问一下,谁能知道谷歌云存储服务存储该序列化对象多长时间?

您可以使用任何 Java 序列化方式(通常使用 ObjectOutputStream)序列化 GcsOutputChannel。如果在 AE 上运行,则可能需要将该序列化字节保存在数据存储中(作为数据存储 Blob)。有关如何将序列化对象与字节数组相互转换的信息,请参阅此链接。

相关内容

  • 没有找到相关文章

最新更新