javascript - 创建一个预签名的 url 并使用 Node js 将文件上传到谷歌云存储

标签 javascript node.js google-cloud-storage

我需要使用签名 url 将文件上传到谷歌云存储。我需要通过不同的步骤上传。

  1. 使用 bucketName、服务 key 和所需的安全凭证创建一个 signedUrl。(使用任何 node.js 库)

  2. 使用 Postman 或 restClient 使用创建的签名 url 上传单个文件。

这是我创建用于上传的 signedUrl 的代码

var crypto = require("crypto");
var fs = require("fs");

var URL_VALID_DURATION = 1000 * 120;//for 120 seconds

var expiry = Math.floor(((new Date).getTime() + URL_VALID_DURATION) / 1000);

var key = 'filename';
var bucketName = 'bucketName';
var accessId = 'gserviceaccount.com';
var stringPolicy = "POST\n" + "\n" + "\n" + expiry + "\n" + '/' + bucketName + '/' + key;
var base64Policy = Buffer(stringPolicy, "utf-8").toString("base64");
var privateKey = fs.readFileSync("google-services-private-key.pem", "utf8");
var signature = encodeURIComponent(crypto.createSign('sha256').update(stringPolicy).sign(privateKey, "base64"));
var signedUrl = "https://" + bucketName + ".commondatastorage.googleapis.com/" + key + "?GoogleAccessId=" + accessId + "&Expires=" + expiry + "&Signature=" + signature;

console.log(signedUrl);

但是我在使用 postman 或 rest client 时出错

<?xml version='1.0' encoding='UTF-8'?>
<Error>
    <Code>SignatureDoesNotMatch</Code>
    <Message>The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.</Message>
    <StringToSign>PUT

multipart/form-data
1458024549
/bucketName/fileName</StringToSign>
</Error>

最佳答案

只是将 stringPolicy 方法更改为 PUT。并以二进制形式发送图像。

var crypto = require("crypto");
var fs = require("fs");

var URL_VALID_DURATION = 1000 * 120;//for 120 seconds

var expiry = Math.floor(((new Date).getTime() + URL_VALID_DURATION) / 1000);

var key = 'filename';
var bucketName = 'bucketName';
var accessId = 'gserviceaccount.com';
var stringPolicy = "PUT\n" + "\n" + "\n" + expiry + "\n" + '/' + bucketName + '/' + key;
var base64Policy = Buffer(stringPolicy, "utf-8").toString("base64");
var privateKey = fs.readFileSync("google-services-private-key.pem", "utf8");
var signature = encodeURIComponent(crypto.createSign('sha256').update(stringPolicy).sign(privateKey, "base64"));
var signedUrl = "https://" + bucketName + ".commondatastorage.googleapis.com/" + key + "?GoogleAccessId=" + accessId + "&Expires=" + expiry + "&Signature=" + signature;

console.log(signedUrl);

关于javascript - 创建一个预签名的 url 并使用 Node js 将文件上传到谷歌云存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36003782/

相关文章:

node.js - google chrome 扩展中远程 Node 服务器上的 socket.io

java - 以编程方式将 Android 设备上 SD 卡上的本地文件夹与 Google Drive 同步

javascript - 为什么jQuery或诸如getElementById之类的DOM方法找不到元素?

javascript - 多个事件仅渲染一次图表 : Highcharts

javascript - 使用 Canvas 在嵌套圆圈中添加文本?

node.js - 在 NodeJS 查询字符串和请求模块中传递重音字符

node.js - 如何在 Dockerfile 中执行 2 个单独的命令?

google-cloud-platform - 从 Google Cloud Storage Bucket 下载文件夹

android - 带有应用程序引擎的 Google 云存储

javascript - 将附加 HTML 的属性设置为 jquery 中的变量?