javascript - 如何在nodejs中生成aws s3签名
问题描述
我一直在尝试生成预签名 url 以使用纯 javascript 上传我的对象,但我不断收到 signaturedoesn'tmatch 错误。如果有人可以帮助我,那将是很大的帮助。
const myBucket = "my-bucket-name";
const accessKey = "myaccesskey";
const secretAccessKey = "mysecretkey";
const regionName = "us-east-1";
const myKey = "codeTest.jpg";
const serviceName = "s3upload";
const signedUrlExpireSeconds = 60 * 5; // In 5 minutes
const ep = new AWS.Endpoint("s3.wasabisys.com");
const s3 = new AWS.S3({
accessKeyId: accessKey,
secretAccessKey: secretAccessKey,
bucket: myBucket,
signatureVersion: "v4",
region: regionName,
endpoint: ep
});
const signedUrl = s3.getSignedUrl("putObject", {
Bucket: myBucket,
Key: myKey,
ACL: "public-read",
Expires: signedUrlExpireSeconds,
});
解决方案
PutObject
创建到 S3的预签名 URL 的函数。这是来自 nodejs/express 服务器。
函数createPresignedPost
const S3 = require('aws-sdk/clients/s3');
const s3 = new S3(); //or new S3(config.aws.access), if you want to pass credentials
module.exports.createPresignedPost = async function(remoteFile, expireSeconds = 180) {
const params = {
Bucket: S3_BUCKET_NAME,
Fields: {
key: remoteFile //This is S3 file name, where it will get uploaded
},
Expires: expireSeconds,
Conditions: [
{'acl': 'private'},
["content-length-range", 0, 20971520], //20 MB
["starts-with", "$Content-Type", "image/"] //only images
]
};
return new Promise((resolve, reject) => {
s3.createPresignedPost(params, (err, data) => {
if(err) {
return reject(err);
}
resolve(data);
});
})
}
如果您将此功能用作
const signed = await createPresignedPost("uploaded/file");
const body = {
upload_url: signed.url,
upload_fields: Object.assign({acl: 'private'}, signed.fields)
};
return res.status(ht.C.OK).send({success: true, data: body});
和@客户端,
ApiService.imagePost(item._id).then(response => {
signed = response.data.data;
const formData = new FormData();
if (files.length > 0) {
for(const field in signed.upload_fields) {
formData.append(field, signed.upload_fields[field]);
}
formData.append("Content-Type",files[0].type);
formData.append("file",files[0]);
return ApiService.file.upload(signed.upload_url, formData);
}
}
推荐阅读
- slack - 使用 slack api 向 slack 发布消息时如何忽略表情符号?
- ios - iOS 13 > 当应用程序被杀死且不在后台时,通用应用程序链接不起作用
- javascript - 单击图像时复制图像位置
- android - Android 模拟器 EXIF 数据
- xamarin - 复选框值/无 MVVM Xamarin
- jquery - 使用按钮在 jquery 中启动下一个动画
- c++ - 非递归访问自定义变体 - 如何优雅地返回值?
- python - 在 Python 中解析字典
- terminal - 如何在 Pyqt5 GUI 应用程序中嵌入 Xterm 终端?
- python - Python 链表实现 - 在第 n 个位置插入节点?为什么代码不起作用?