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

Posted

技术标签:

【中文标题】使用 HTTP PUT 将文件上传到 Amazon S3【英文标题】:Upload file to Amazon S3 using HTTP PUT 【发布时间】:2016-09-16 01:24:24 【问题描述】:

我在一家金融机构工作,出于安全原因,我的雇主不能将 access key idaccess key secret 提供给 AWS 账户。这意味着我不能使用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');
);

这行得通吗?

【问题讨论】:

出于安全原因,我的雇主不能将访问密钥 ID 和访问密钥秘密提供给 AWS 账户。 停止。这是一个有严重缺陷的前提。没有“the”(单个)访问密钥/秘密。您可以根据需要创建任意数量的密钥和随附的密钥,每个密钥都有自己的单独权限。您还可以将权限委派给其他 AWS 账户拥有的密钥。使用可公开写入的存储桶没有任何意义。 【参考方案1】:

您的上述代码仅适用于您有自定义存储(它也应该是公开的)而不适用于 AWS 存储的情况。

对于 AWS 存储 access key idaccess key secret 是强制性的,没有这些您无法将文件上传到存储

【讨论】:

感谢您澄清@Supraj v【参考方案2】:

这有点旧,但对于任何寻找相同的人来说,您现在可以使用预签名的 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');
));

【讨论】:

以上是关于使用 HTTP PUT 将文件上传到 Amazon S3的主要内容,如果未能解决你的问题,请参考以下文章

使用 HTTP PUT 将文件上传到 Sharepoint (WSS 3.0) 文档库

允许使用 Amazon S3 的 OPTIONS HTTP 方法

如何在不使用 SDK 的情况下使用 .NET HttpClient 上传到 Amazon S3

替换 Amazon S3 中上传文件的字节

使用 NodeJS 将文件上传到 Amazon S3

使用 Alamofire 将文件上传到 amazon s3