如何从Node.js上传文件到S3

834 阅读2分钟

我有一个简单的用例。我正在建立DEVJOBS,一个为开发者服务的招聘网站,现在是时候建立一个提交新工作机会的表单了。

招聘者可以输入公司的详细信息,工作的详细信息,以及公司的标志图片。

这些数据存储在数据库中,起初我试图将logo存储在数据库中,但过了一会儿,我意识到虽然技术上可以,但在存储二进制数据时有一些问题,而且任务时间太长。所以我说,"好吧,我们就把它上传到S3"。

S3是由AWS提供的精彩服务之一。因为我已经用AWS做其他事情了,所以添加一个S3桶很容易。

所以我去创建了一个S3桶。

我已经有一个AWS账户。如果你没有,从这里开始:https://aws.amazon.com。

一旦你有一个账户,在AWS创建一个IAM用户。登录到AWS,点击上面的名字,然后点击 "我的安全证书"。

![](Screen Shot 2021-06-08 at 14.42.05-redacted_dot_app.png)

在侧边栏上点击 "用户",然后 "添加用户"。启用 "程序化访问"。

![](Screen Shot 2021-06-08 at 14.43.24.png)

通过你在页面底部找到的按钮进入下一个屏幕("下一步:权限")。

点击 "直接附加现有政策"。

![](Screen Shot 2021-06-08 at 14.44.24.png)

在过滤器中输入 "S3 "以显示S3政策

![](Screen Shot 2021-06-08 at 14.44.41.png)

选择AmazonS3FullAccess 权限。

![](Screen Shot 2021-06-08 at 14.44.57.png)

一旦用户被创建,你会有一对访问密钥ID和秘密访问密钥。把这些复制到你的项目中的.env 文件,或者把它们储存在某个地方,这样你以后就可以使用它们。

接下来,在S3中去创建一个桶。从S3主页s3.console.aws.amazon.com,点击 "创建水桶 "按钮。

设置一个名称,选择一个AWS区域,禁用 "阻止所有公共访问"(我们将在另一篇文章中讨论权限问题),然后点击页面底部的创建桶按钮。

![](Screen Shot 2021-06-08 at 14.47.39.png)

完成了!现在是时候深入到Node.js了。我在Next.js中使用这段代码,服务器端,在一个API调用中。

首先安装 aws-sdk包与npm install aws-sdk

如前所述,将你的AWS访问代码存储在.env

AWS_ACCESS_KEY_ID=<the access key>
AWS_SECRET_ACCESS_KEY=<the secret>
AWS_BUCKET_NAME=<the bucket name>

添加

import AWS from 'aws-sdk'

在上面。

然后用s3 对象进行初始化。

const s3 = new AWS.S3({
  accessKeyId: process.env.AWS_ACCESS_KEY_ID,
  secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
})

现在,当你想上传一个文件时,从存储中加载它

const filename = 'the-file-name'
const fileContent = fs.readFileSync(fileName)

const params = {
  Bucket: process.env.AWS_BUCKET_NAME,
  Key: `${filename}.jpg`,
  Body: fileContent
}

s3.upload(params, (err, data) => {
  if (err) {
    reject(err)
  }
  resolve(data.Location)
})