【问题标题】:resumable upload with Client Library for Google Cloud Storage使用 Google Cloud Storage 的客户端库进行可恢复上传
【发布时间】:2016-06-17 02:34:32
【问题描述】:

之前,我问了一个问题https://stackoverflow.com/questions/35581090/can-i-use-resumable-upload-for-gae-blobstore-api 关于使用 Blobstire API 进行可恢复上传。 就我自己而言,我认为使用 Blobstire API 实现可恢复上传是不可能的。 在这种情况下,我正在尝试使用 Java 客户端库实现 Google Cloud Storage。目前,我将我的视频文件下载到存储桶并提供视频。我的 servlet 看起来像 google 示例中的样子

   @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)

我意识到,应该手动组织可恢复上传的服务器端,并且我的后端应该能够为我提供上传块的范围并允许继续引导到 OutputChannel。

GcsOutputChannel 的文档说:

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

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

顺便问一下,谁能知道谷歌云存储服务存储这个序列化对象多久?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 是的,你没看错,我在 GAE 中运行。我考虑过在云存储中使用 Blobstore API,甚至将序列化对象保持为相同。 但是这不是过分吗? 我的意思是,Google API 没有特殊的机制来存储序列化的 GcsOutputChannel。码头上写着:“序列化实例的有效时间是有限的,由谷歌云存储服务决定”。无论如何,非常感谢你,你让我相信在存储中保存序列化对象也是可能的解决方案
    • 不,没有专门的方法来存储 GcsOutputChannel 但是有一种方法可以使其可存储,因此您可以存储它(基本上是 GCS 可恢复写入的句柄以及任何无法写入的内容[因为 GCS 需要至少 256 KB 的块,除了最后一个])任何你想要的地方。如前所述,一个常见的地方是数据存储区。我忘了说这样的句柄有效期为一周(由服务强制执行)。
    • 好的,谢谢。关于那个的最后一个问题。我是否正确理解序列化的对象将比我写入的字节数占用更多的空间(因为序列化算法)?
    • 我不确定您所说的“我写的字节数”是什么意思?它不会保存所有写入 GcsOutputChannel 的字节,而只会保存那些无法刷新的字节(提醒小于 256K)。在这种情况下,序列化的开销可以忽略不计。
    • 哦,对不起。我希望我开始明白了。你的意思是我必须保存唯一的对象 GcsOutputChannel,它隐藏了指向我的数据的链接,而不是数据本身。显然,我没有正确理解什么代表频道。
    猜你喜欢
    • 2015-07-26
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2016-06-15
    • 1970-01-01
    相关资源
    最近更新 更多