我有一个简单的用例。我正在建立DEVJOBS,一个为开发者服务的招聘网站,现在是时候建立一个提交新工作机会的表单了。
招聘者可以输入公司的详细信息,工作的详细信息,以及公司的标志图片。
这些数据存储在数据库中,起初我试图将logo存储在数据库中,但过了一会儿,我意识到虽然技术上可以,但在存储二进制数据时有一些问题,而且任务时间太长。所以我说,"好吧,我们就把它上传到S3"。
S3是由AWS提供的精彩服务之一。因为我已经用AWS做其他事情了,所以添加一个S3桶很容易。
所以我去创建了一个S3桶。
我已经有一个AWS账户。如果你没有,从这里开始:https://aws.amazon.com。
一旦你有一个账户,在AWS创建一个IAM用户。登录到AWS,点击上面的名字,然后点击 "我的安全证书"。

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

通过你在页面底部找到的按钮进入下一个屏幕("下一步:权限")。
点击 "直接附加现有政策"。

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

选择AmazonS3FullAccess 权限。

一旦用户被创建,你会有一对访问密钥ID和秘密访问密钥。把这些复制到你的项目中的.env 文件,或者把它们储存在某个地方,这样你以后就可以使用它们。
接下来,在S3中去创建一个桶。从S3主页s3.console.aws.amazon.com,点击 "创建水桶 "按钮。
设置一个名称,选择一个AWS区域,禁用 "阻止所有公共访问"(我们将在另一篇文章中讨论权限问题),然后点击页面底部的创建桶按钮。

完成了!现在是时候深入到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)
})