使用 HTTP PUT 将文件上传到 Amazon S3
Upload file to Amazon S3 using HTTP PUT
我在一家金融机构工作,出于安全原因,我的雇主不能向 AWS 账户提供 access key id
和 access key secret
。这意味着我不能使用 aws-sdk.
作为下一个选项,是否可以使用 HTTP PUT 将文件上传到 public S3 存储桶而不使用需要 access key id
和 access 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');
});
这行得通吗?
您的上述代码仅在您有自定义存储(也应该是 public)时才有效,不适用于 AWS 存储。
对于 AWS 存储 access key id
和 access key secret
是强制性的,没有这些您无法将文件上传到存储
这有点旧,但对于任何寻找相同内容的人,您现在可以使用预签名 url 来实现此目的,它的工作原理是在您的服务器上创建一个预签名 url,与客户端共享并使用它上传文件到 s3
服务器生成 url:
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');
}));
我在一家金融机构工作,出于安全原因,我的雇主不能向 AWS 账户提供 access key id
和 access key secret
。这意味着我不能使用 aws-sdk.
作为下一个选项,是否可以使用 HTTP PUT 将文件上传到 public S3 存储桶而不使用需要 access key id
和 access 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');
});
这行得通吗?
您的上述代码仅在您有自定义存储(也应该是 public)时才有效,不适用于 AWS 存储。
对于 AWS 存储 access key id
和 access key secret
是强制性的,没有这些您无法将文件上传到存储
这有点旧,但对于任何寻找相同内容的人,您现在可以使用预签名 url 来实现此目的,它的工作原理是在您的服务器上创建一个预签名 url,与客户端共享并使用它上传文件到 s3
服务器生成 url:
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');
}));