node.js - 使用 signedURL 将 base64 文件上传到 GCS
问题描述
我正在尝试使用签名的 URL将base64文件/图像上传到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 或任何标题时是否遗漏了某些内容。
谢谢 :)
解决方案
上传到 Google Cloud Storage 的 Object 大小不同的原因实际上是 Object 的 Metadata 不同。当您使用 REST API 使用 POSTMAN 上传图像对象时,API 标头将作为图像元数据的一部分添加。该Google 文档明确指出“云存储将这些标头存储为对象元数据的一部分”。
Object metadata Introduction的第一行也确认了存储在 Cloud Storage 中的 Objects 具有与之关联的元数据。因此,API 标头被添加为图像对象的元数据,从而增加了对象的大小。
通过控制台上传的图像对象没有对象元数据,除非它们是明确设置的。
推荐阅读
- java - 如何根据android中的时间戳获取电池百分比?
- javascript - 是的,嵌套对象的验证模式
- oauth-2.0 - Postman 如何在授权码流中获取 OAuth 2.0 auth token?
- ios - 为什么 UIAlertController 在等待答案时不暂停代码?
- python - 如何按间隔分隔数据框列并绘制
- c++ - arm-none-eabi/bin/ld:“.bss”部分不适合“RAM”区域
- html - 在移动菜单上显示链接标题
- python - 将排名最高的值传递给列表的函数
- python - 从函数中,如何将计算添加到列表中?
- r - 根据百分比制作数据子集