【发布时间】:2021-10-11 07:50:59
【问题描述】:
我正在尝试使用 nodeJS 服务器和 React 客户端应用程序将文件上传到 aws S3。我是aws的新手,所以我想我做错了什么。我创建了一个完全私有的备份,以便只有应用程序可以访问文件。问题是当我想上传文件时,我需要获取链接 myBucket.getSignedUrl () 才能上传。当我这样做并将其发送到前端时,前端使用我要上传的文件获取到 S3 的链接,问题是它返回以下错误:
访问获取 'https://atlasworld-progress.s3.amazonaws.com/IMG_20210202_100322.jpg?AWSAccessKeyId=AKIAZGHWWSFL5XOWPRXJ&Content-Type=image%2Fjpeg&Expires=1633937718&Signature=o8S8MQQ3fVdONePGOT4a5ic7CcU%3D' 来自原点“http://localhost:3000”已被 CORS 策略阻止: 对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。如果不透明的响应满足您的需求,请设置请求的 模式为“no-cors”以获取禁用 CORS 的资源。
这里是aws配置文件:
import AWS from 'aws-sdk'
AWS.config.update({
accessKeyId: process.env.AWS_ACCESS_KEY,
secretAccessKey: process.env.AWS_SECRET_KEY
})
const S3_BUCKET ='atlasworld-progress';
const REGION =process.env.AWS_REGION;
const URL_EXPIRATION_TIME = 60; // in seconds
const myBucket = new AWS.S3({
params: { Bucket: S3_BUCKET},
region: REGION,
})
export const generatePreSignedPutUrl = async (fileName, fileType) => {
const url = await myBucket.getSignedUrl('putObject', {
Key: fileName,
ContentType: fileType,
Expires: URL_EXPIRATION_TIME
});
return url;
}
在 express 控制器中,它只是将由函数 generatePreSignedPutUrl() 生成的链接返回给客户端。 下面是 React 中前端函数的代码:
const [frontPhoto, setFrontPhoto] = useState();
const upload = async (e) => {
e.preventDefault();
await JWT.checkJWT();
const requestObject = {
fileName: frontPhoto.name,
fileType: frontPhoto.type,
token: JWT.getToken()
};
axiosReq.post(`${serverPath}/prepare_s3`, requestObject).then((res) => {
//the following fetch is the one that fails
fetch(res.data, {
method: "PUT",
body: frontPhoto,
}).then((res) => {
console.log(res);
});
});
}
如果有人知道发生了什么,我将不胜感激。
我还想问一下 S3 一次只能上传一个文件,还是一次 fetch 可以上传不同的文件。
谢谢!
【问题讨论】:
标签: node.js amazon-web-services amazon-s3