javascript - 上传到 Amazon S3 会出现 403 错误 - 以下示例相册指南
问题描述
我正在尝试将简单图像上传到 S3 存储桶,403
尝试上传时总是出错,但 list 和 createAlbum 方法有效。
我已遵循本指南:从浏览器将照片上传到 Amazon S3 - 适用于 JavaScript 的 AWS 开发工具包
由于教程的上传对我不起作用,我尝试使用该S3.upload
方法但没有成功,如下所示:
S3.upload({
Key: 'my-album/aqui.png',
Body: file,
ACL: 'public-read',
Bucket: SOUNDS_BUCKET_NAME
}, function(err, data) {
if(err) {
alert('fail')
} else {
alert('Successfully Uploaded!');
}
}
);
我相信这个错误是我的 S3 或身份池上的配置,但配置与教程相同:
CORS
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
我究竟做错了什么?
解决方案
这是将文件上传到 S3 的 Node.js 代码。
设置环境
AWS 凭证
要开始使用,您需要先生成AWS 安全密钥访问凭证。为此,请登录您的AWS 管理控制台。
点击您的用户名:
选择访问密钥->创建新访问密钥:
之后,您可以从此窗口复制访问密钥 ID和秘密访问密钥.CSV
,也可以将其下载为文件:
创建 S3 存储桶
现在让我们创建一个具有适当访问权限的 AWS S3 存储桶。我们可以使用 AWS 管理控制台或使用 Node.js 来做到这一点。
要使用管理控制台创建 S3 存储桶,请从服务菜单中选择 S3 服务:
选择“创建存储桶”并输入您的存储桶的名称和您要托管存储桶的区域。如果您已经知道大多数用户来自哪个地区,那么明智的做法是选择尽可能接近他们所在地区的地区。这将确保来自服务器的文件将在更优化的时间范围内提供服务。
您为存储桶选择的名称应该是所有 AWS 用户中唯一的名称,因此如果该名称不可用,请尝试使用新名称:
遵循向导并根据您的要求配置权限和其他设置。
要使用 Node.js 创建存储桶,我们首先必须设置我们的开发环境。
开发环境
通过配置一个新的 Node.js 项目开始我们的示例:
$ npm init
要开始在 Node.js 中使用任何 AWS 云服务,我们必须安装AWS SDK(系统开发工具包)。
使用您喜欢的包管理器安装它 - 我们将使用npm
:
$ npm i --save aws-sdk
执行
创建 S3 存储桶
如果您已经手动创建了存储桶,则可以跳过此部分。但如果没有,让我们create-bucket.js
在项目目录中创建一个文件。
导入aws-sdk
库以访问您的 S3 存储桶:
const AWS = require('aws-sdk');
现在,让我们定义三个常量来存储ID
、SECRET
和BUCKET_NAME
。这些用于识别和访问我们的存储桶:
// Enter copied or downloaded access ID and secret key here
const ID = '';
const SECRET = '';
// The name of the bucket that you have created
const BUCKET_NAME = 'test-bucket';
现在我们需要通过传递我们的访问密钥来初始化 S3 接口:
const s3 = new AWS.S3({
accessKeyId: ID,
secretAccessKey: SECRET
});
推荐阅读
- excel - 将缩放应用于用户窗体时,DTPicker 的 Vba Excel 问题
- python - Python可以创建一个可以在没有安装python和pip的地方部署的自包含包吗?
- docker - Kubernetes 中 JSON 日志记录的最佳实践
- flutter - 嵌套 TabBar 导航中的 Persitent AppBar
- javascript - React JS(元素类型无效)
- python - 从字典返回值
- javascript - SweetAlert2 中的 Yandex.Map
- amazon-web-services - 如何查看 EBS 增长趋势?
- node.js - 使用 Sinon 模拟服务模块
- asp.net - 如何在 asp.net Blazor 页面中使用 RadioButtons 和 Checkboxes