Amazon s3 如何从下一个JS应用程序安全地将图像上传到AmazonS3?

Amazon s3 如何从下一个JS应用程序安全地将图像上传到AmazonS3?,amazon-s3,next.js,Amazon S3,Next.js,我正在构建一个NextJS应用程序,我需要授权用户能够将图像上传到Amazon S3 bucket,以便在帖子中使用 最好的办法是什么?我环顾了一下四周,但只能找到通过express上传的教程,或者使用在前端运行的react-s3包,但我对在前端代码中存储amazon s3的敏感数据持谨慎态度 我可以在next上的api路由中编写lamda函数并从那里发送吗?或者是否有一种安全的方式从字体端上传。我在快递等方面没有太多的经验。。。但是任何帮助都将不胜感激。因此您必须在api文件夹中创建一个具有此

我正在构建一个NextJS应用程序,我需要授权用户能够将图像上传到Amazon S3 bucket,以便在帖子中使用

最好的办法是什么?我环顾了一下四周,但只能找到通过express上传的教程,或者使用在前端运行的react-s3包,但我对在前端代码中存储amazon s3的敏感数据持谨慎态度


我可以在next上的api路由中编写lamda函数并从那里发送吗?或者是否有一种安全的方式从字体端上传。我在快递等方面没有太多的经验。。。但是任何帮助都将不胜感激。

因此您必须在api文件夹中创建一个具有此功能的文件

import aws from "aws-sdk";
 aws.config.update({
    accessKeyId: "your id ",
    secretAccessKey: "your secret ",
    region: "your bucket region",
    signatureVersion: 'v4',
  });
  const s3 = new aws.S3();
  const post = await s3.createPresignedPost({
    Bucket: "your bucket name",
    Fields: {
      key: req.query.file,
    },
    Expires: 600, // seconds
    ACL:"public-read",
    Conditions: [
      ['content-length-range', 0, 12048576], 
    ],
  });
如果您调用此api,它将返回一个链接url,其中包含一些数据,放在标题中访问10分钟以上载图像,如果您使用文件获取此url,则将在s3中上载到bucket

const res = await fetch(
  `${server}/api/admin/add/addImage?file=${file.name}`
);

const { url, fields } = await res.json();
const formData = new FormData();

Object.entries({ ...fields, file }).forEach(([key, value]) => {
  formData.append(key, value);
});

const upload = await fetch(url, {
  method: "POST",
  body: formData,
});
setUrlfileUploaded(`${upload.url}/${file.name}`);

if (upload.ok) {
  console.log("Uploaded successfully!");
} else {
  console.error("Upload failed.");
}

因此,您必须使用此函数在api文件夹中创建一个文件

import aws from "aws-sdk";
 aws.config.update({
    accessKeyId: "your id ",
    secretAccessKey: "your secret ",
    region: "your bucket region",
    signatureVersion: 'v4',
  });
  const s3 = new aws.S3();
  const post = await s3.createPresignedPost({
    Bucket: "your bucket name",
    Fields: {
      key: req.query.file,
    },
    Expires: 600, // seconds
    ACL:"public-read",
    Conditions: [
      ['content-length-range', 0, 12048576], 
    ],
  });
如果您调用此api,它将返回一个链接url,其中包含一些数据,放在标题中访问10分钟以上载图像,如果您使用文件获取此url,则将在s3中上载到bucket

const res = await fetch(
  `${server}/api/admin/add/addImage?file=${file.name}`
);

const { url, fields } = await res.json();
const formData = new FormData();

Object.entries({ ...fields, file }).forEach(([key, value]) => {
  formData.append(key, value);
});

const upload = await fetch(url, {
  method: "POST",
  body: formData,
});
setUrlfileUploaded(`${upload.url}/${file.name}`);

if (upload.ok) {
  console.log("Uploaded successfully!");
} else {
  console.error("Upload failed.");
}