使用HTTP PUT将文件上载到Amazon S3

时间:2016-09-16 01:24:25

标签: node.js amazon-s3 npm-request

我在金融机构工作,出于安全考虑,我的雇主无法向AWS账户提供access key idaccess key secret。这意味着我无法使用aws-sdk

作为下一个选项,是否可以使用HTTP PUT将文件上传到公共S3存储桶,而无需使用需要access key idaccess key secret的AWS-SDK?

我看了一下这个答案:How to upload a file using a rest client for node

正在考虑这种方法:

var request = require('request');

var options = {
    method: 'PUT',
    preambleCRLF: true,
    postambleCRLF: true,
    uri: 'https://s3-ap-southeast-2.amazonaws.com/my-bucket/myFile.pdf',
    multipart: [
        {
            'content-type': 'application/pdf'
            body: fs.createReadStream('/uploads/uploaded-file.pdf') 
        }
    ]
}

request(options, function(err, response, body){

    if(err){
        return console.log(err);
    }

    console.log('File uploaded to s3');
});

这可行吗?

2 个答案:

答案 0 :(得分:1)

只有当您拥有自定义存储(也应该是公共存储)而不是AWS存储时,您的上述代码才有效。

对于AWS存储access key idaccess key secret是必需的,如果没有这些,则无法将文件上传到存储

答案 1 :(得分:0)

这有点旧了但是对于那些寻找相同内容的人来说,你现在可以使用预先签名的网址来实现这一点,它是如何工作的,你在服务器上创建一个preSigned网址,与客户端共享并使用它上传文件到s3

服务器生成网址:

const AWS = require('aws-sdk')

const s3 = new AWS.S3({
  region: 'us-east-1',
  signatureVersion: 'v4'
})
AWS.config.update({accessKeyId: 'access-key', secretAccessKey: 'access-pass'})

const myBucket = 'clearg-developers'
const myKey = 'directory/newFile.zip'
const signedUrlExpireSeconds = 60 * 5 //seconds the url expires

const url = s3.getSignedUrl('putObject', {
    Bucket: myBucket,
    Key: myKey,
    Expires: signedUrlExpireSeconds

});
return url

并且在节点上的客户端上你可以放置一个空体:

var fileName = '/path/to/file.ext';
var stats = fs.statSync(fileName);
fs.createReadStream(fileName).pipe(request({
    method: 'PUT',
    url: url,
    headers: {
    'Content-Length': stats['size']
}
}, function (err, res, body) {
    console.log('success');
}));