如何使用带有签名 url 的 gcs-resumable-upload

2023-11-29

我希望能够使用 Node.js 客户端应用程序对 Google Cloud Storage 进行可恢复上传gcs 可续传上传包,连​​同签名网址(因为客户端应用程序是由未经身份验证的用户调用的)。

我的服务器通过调用生成签名网址获取签名网址 with {action: 'resumable'}。然后,服务器将 POST 发送到带有标头的签名 url{ 'x-goog-resumable': 'start' }和一个空的主体,并收到一个响应location标题看起来像下面这样:

https://storage.googleapis.com/<bucket_name/<file_path>?GoogleAccessId=<service_account>&Expires=<expiry_time>&Signature=<signature>&upload_id=<upload_id>

我的问题是:如果我退回上述内容location标头到我的客户端,客户端可以使用它来执行可恢复上传吗gcs 可续传上传,如果是这样,具体是怎样的?如果有人有一个例子,将不胜感激!


如果你使用的是java那么。

根据谷歌文档here很清楚如何创建签名 URL 以将对象上传到存储桶。

但是您需要为可恢复上传添加额外的标头(“x-goog-resumable:start”)。文档中没有提到这一点。

import com.google.auth.oauth2.GoogleCredentials;
import com.google.auth.oauth2.ServiceAccountCredentials;
import com.google.cloud.storage.*;

import java.io.*;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

public class GenerateV4PutObjectSignedUrl {

    public static void generateV4GPutObjectSignedUrl(
            String projectId, String bucketName, String objectName) throws StorageException, IOException {
        File initialFile = new File("src/main/java/credentials.json");
        InputStream serviceAccountJson = new FileInputStream(initialFile);

        ServiceAccountCredentials credentials = (ServiceAccountCredentials)
                GoogleCredentials.fromStream(serviceAccountJson);
        Storage storage = StorageOptions.newBuilder().setProjectId(projectId).setCredentials(credentials).build().getService();

        // Define Resource
        BlobInfo blobInfo = BlobInfo.newBuilder(BlobId.of(bucketName, objectName)).build();

        // Generate Signed URL
        Map<String, String> header = new HashMap<>();
        header.put("x-goog-resumable", "start");

        URL url =
                storage.signUrl(
                        blobInfo,
                        15,
                        TimeUnit.MINUTES,
                        Storage.SignUrlOption.httpMethod(HttpMethod.POST),
                        Storage.SignUrlOption.withExtHeaders(header),
                        Storage.SignUrlOption.withV4Signature());


        System.out.println("Generated PUT signed URL:");
        System.out.println(url);
    }

    public static void main(String[] args) throws IOException {
        generateV4GPutObjectSignedUrl("projectId", "bucketName", "objectName");
    }
}
Use the generated URL to make a POST call. I used cURL for the request.
The response would something like this.

Host: storage.googleapis.com
> User-Agent: curl/7.54.0
> Accept: */*
> x-goog-resumable: start
>

< HTTP/2 201
< content-type: text/plain; charset=utf-8
< x-guploader-uploadid: some-id
< location: session URL for actual resumable upload
< content-length: 0
< date: Mon, 07 Sep 2020 12:18:00 GMT
< server: UploadServer

现在使用该位置进行 PUT 调用来上传对象。有关中断时使用哪些标头的更多信息,请参阅link

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用带有签名 url 的 gcs-resumable-upload 的相关文章

随机推荐

  • 在shiny-rstudio 中的rhandsontable 中反应/计算列

    我正在尝试向以下交互式表添加自定义验证 我想做的事情如下 该表包含三个变量 即 mpg cyl 和 disp 假设我编辑第一行的 mpg 值 然后 一旦我按下 Enter 按钮 第一行的 disp 值应该自动更改 计算公式为 disp mp
  • 对象静态成员的初始化

    静态成员有时会让我感到困惑 我了解如何初始化简单的内置类型 例如int类似的东西int myClass statVar 10 您将其放置在 cpp 文件中 但我有以下类型的内容 class myClass public Some metho
  • 将右值传递给非引用参数,为什么编译器不能删除副本?

    struct Big int a 8 void foo Big a Big getStuff void test1 foo getStuff 编译 在 Linux 上使用 clang 6 0 0 for x86 64 因此 System V
  • 使用 error_log() 通过电子邮件发送错误消息

    php 函数 error log 允许您将第二个参数设置为 1 将日志发送到电子邮件 我这样做了 但我想以 html 形式显示消息 代码如下所示 error log this gt errorMsg 1 ADMIN MAIL Content
  • 运行 android HelloTabWidget 示例时出现问题 - addTab() 上的 NullPointerException

    我已经尝试过选项卡布局示例 我还修复了示例中的几个拼写错误 并将所有活动添加到清单中 但是 当我在模拟器上运行它时 我在第一行收到一个 NullPointerException 上面写着 tabHost addTab 规格 所以我的问题当然
  • Swift 3 中具有属性的单例

    在苹果的将 Swift 与 Cocoa 和 Objective C 文档结合使用 针对 Swift 3 进行了更新 他们给出了以下单例模式示例 class Singleton static let sharedInstance Single
  • 当请求时间过长时使用哪个 HTTP 响应代码?

    我正在构建一个 API 可以对我们存储的非常大的数据库进行分析 有些请求需要很长时间才能处理 我们希望主动中止耗时超过 10 分钟的请求 但在我们尝试之前 我们不知道请求是否会花费那么长时间 大多数时候 这并不是因为服务器瞬时过载 这是因为
  • Objective-C 块与选择器。哪一个更好?

    例如 在 Objective C 中 当您实现要执行重复操作的方法时 您需要在该语言为您提供的几个选项之间进行选择 interface FancyMutableCollection NSObject void sortUsingSelect
  • 每隔一分钟运行 JS 函数

    我正在开发这个 JavaScript 时钟 我希望它能够与客户端的系统时钟完美同步 我知道如何使用Date对象 我知道如何每 60000 毫秒 1 分钟 运行一次更新函数 问题是客户端可能会在半分钟过去时加载页面 从而使时钟落后 30 秒
  • React.js 中声明式和命令式的区别?

    最近我研究了很多关于 Facebook JavaScript 库 React js 的功能和使用方法 当谈到它与 JavaScript 世界其他部分的差异时 通常会提到两种编程风格declarative and imperative被提到
  • 创建一个“停靠”到屏幕一侧并在最大化时限制其他窗口大小的 .NET 应用程序

    我收到了来自上级的一个有趣的请求 他们想要一个简单的应用程序 可以在用户的 计算机上显示多个时区的时间 这本身是微不足道的 一个带有计时器的简单窗口 它将获取当前 UTC 时间并将其转换为他们想要查看的任意数量的时区 以更新某些标签的文本
  • SpringBoot从2.1.1升级到2.1.2时出错

    我有一个带有 Spring Boot 版本的 SpringBoot 应用程序2 1 1 RELEASE 我尝试将其升级到最新版本 2 1 2 RELEASE 现在我在初始化时遇到错误 源代码中是否需要更改某些内容 我看到Spring版本从5
  • Tcl 错误:命令名无效 tcl_findLibrary

    当我键入以下命令 使用 iPython 时出现此错误Tkinter Tk pylab plot 或者一般运行 pylab 但是import pylab不会引发任何错误 Tcl error invalid command name tcl f
  • 处理 UTC 日期和未来

    我刚刚发现 存储UTC 日期如果我们还处理未来的日期 则不太正确 情况似乎如此 因为 时区似乎发生了变化比我们想象的更频繁 幸运的是 我们似乎拥有IANA 技术数据库这似乎会定期更新 但是令人困惑的是 postgres 似乎使用特定版本 它
  • 无法在 codeIgniter 中使用会话

    我的表单控制器中有一个会话 该会话是在用户保存时创建的 会话影响表单页面 所以我的问题是 如果我加载页面而没有单击 保存 则会出现未定义的索引 会话索引 错误 所以我在主页创建了会话 但问题是 如果我加载表单页面而没有首先访问主页 则会出现
  • 将 Jlist 添加到 JScrollPane

    我有一个 JList 需要将其放置在滚动窗格中 因为我从数据库获取 JList 并且值可能会大大增加 我需要能够向下滚动它们 所以我写道 import java awt BorderLayout import java awt Color
  • Spring Batch:如何重新启动并仅重新运行跳过的项目

    更正文件中的错误后 我可以重新启动作业并仅处理跳过的项目吗 我正在阅读文档 目前没有发现这种可能性 如果作业失败 您可以重新启动作业 但我正在考虑在完成一些跳过的项目后重新启动作业 如果通过配置无法实现这一点 我自己实现它的好方法是什么 在
  • 禁用浏览器的后退按钮

    如何禁用浏览器的后退按钮 跨浏览器 不要禁用预期的浏览器行为 让您的页面能够处理用户返回一两页的可能性 不要试图削弱他们的软件
  • Chrome:获取 iFrame 并插入正文

    我有以下代码 在 Firefox 中运行良好 if iFrame iFrame outerDoc getElementById dialog iframe var iFrameDoc iFrame contentWindow documen
  • 如何使用带有签名 url 的 gcs-resumable-upload

    我希望能够使用 Node js 客户端应用程序对 Google Cloud Storage 进行可恢复上传gcs 可续传上传包 连 同签名网址 因为客户端应用程序是由未经身份验证的用户调用的 我的服务器通过调用生成签名网址获取签名网址 wi