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

问题描述:

之前,我询问了关于使用Blobstire API上传可恢复上传的问题https://*.com/questions/35581090/can-i-use-resumable-upload-for-gae-blobstore-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)

我意识到,可恢复的上传serverside应该手动组织,我的后端应该能够给我范围上传的chunck和a继续引导至OutputChannel。

为GcsOutputChannel文档说:

这个类是可序列化的,这允许部分写入的文件, 序列化GcsOutputChannel反序列化它,并继续 写入到同一个文件。对于这一个序列化实例是 有效的时间是有限的,由谷歌云存储服务

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

顺便说一句,任何人都可以知道Google Cloud Storage服务存储该序列化对象多长时间吗?

您可以使用任何Java序列化方法(通常使用ObjectOutputStream)来序列化您的GcsOutputChannel。如果您在AE上运行,则可能需要将该序列化的字节保存到数据存储区(作为数据存储区Blob)。请参阅link以了解如何将字符串数组转换为字节数组。

+0

是的,你理解正确,我跑在GAE。我想在Cloud Storage中使用Blobstore API或者甚至将序列化对象保持原样。 **但这不是过分吗?**我的意思是,Google API没有特殊的机制来存储序列化的GcsOutputChannel。它被写入码头:_“序列化实例的有效时间受到Google云端存储服务的限制和决定”_。无论如何,非常感谢你,你已经确信存储在存储器中的序列化对象也是可能的解决方案 –

+0

不,没有一种专门的方式来存储GcsOutputChannel,但有一种方法可以使它**可存储**,所以你可以存储它(基本上是GCS可恢复写入的句柄以及无法写入的任何内容[因为GCS要求最后一个256 KB的最小块]]任何你想要的地方。如前所述,数据存储的共同点就是数据存储。我忘了提及这个句柄有效期为一周(由服务强制执行)。 – ozarov

+0

好,你好。最后一条关于这个问题的问题。我是否正确理解序列化对象会比我写入的字节数多一些(因为序列化算法)? –