【问题标题】:Upload base64 file into GCS using signedURL使用 signedURL 将 base64 文件上传到 GCS
【发布时间】:2019-10-26 18:12:49
【问题描述】:

我正在尝试使用 签名 URLbase64 文件/图像上传到 Google 云存储。我的服务器端代码(NodeJS)是这样的:

let {Storage} = require('@google-cloud/storage');

storage = new Storage({
  projectId,
  keyFilename: gcloudServiceAccountFilePath,
});

function generateSignedUrl(){
const options = {
      version: 'v4',
      action: 'write',
      expires: Date.now() + 15 * 60 * 1000, // 15 minutes
      //contentType: 'application/octet-stream'
    };
}

const [url] = await storage.bucket(gcloudBucket)
      .file(`${fileRelativePath}`).getSignedUrl(options);

return url;
}

现在,当我尝试使用以下配置的 POSTMAN 时,

Request: PUT
URL: https://storage.googleapis.com/my-signed-url.. //generated from above code
Headers:
  x-goog-acl: 'public-read'
  Content-Type: 'image/jpeg'
Body:
  raw : 'base64-file-conent'

我在 GCS 中上传的文件保持为 base64,文件大小也不同,正如您在存储中看到的那样。

第一张图片通过拖放直接上传到 GCS。

第二张图片是用 POSTMAN 上传的

不确定在通过邮递员上传文件时生成签名 URL 或任何标题时是否遗漏了什么。

谢谢:)

【问题讨论】:

    标签: node.js google-cloud-storage postman pre-signed-url


    【解决方案1】:

    上传到 Google Cloud Storage 的 Object 大小不同的原因其实是 Object 的 Metadata 不同。当您使用 REST API 使用 POSTMAN 上传图像对象时,API 标头将作为图像元数据的一部分添加。这个Google Documentation 明确指出“云存储将这些标头存储为对象元数据的一部分”。

    first line of the Object metadata Introduction 还确认存储在 Cloud Storage 中的对象具有与其关联的元数据。因此,API 标头被添加为图像对象的元数据,从而增加了对象的大小。

    通过控制台上传的图像对象没有对象元数据,they are explicitly set 除外。

    【讨论】:

    • 感谢您的回复,但问题是文件保留在 base64 中,因此我无法预览它。
    • Google 云存储不解码 Base64 编码文件。如果您将编码后的 Base64 图像上传到 GCS 存储桶,则不会被解码。
    • 您可以使用base64编码的字符串作为HTML or CSS background中的图像源的值来查看它。
    猜你喜欢
    • 2018-10-31
    • 1970-01-01
    • 2021-10-09
    • 2014-09-05
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    相关资源
    最近更新 更多