Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AWS:尝试加载预先签名的url时拒绝访问(直接文件上载浏览器)_Javascript_Node.js_Amazon S3_File Upload - Fatal编程技术网

Javascript AWS:尝试加载预先签名的url时拒绝访问(直接文件上载浏览器)

Javascript AWS:尝试加载预先签名的url时拒绝访问(直接文件上载浏览器),javascript,node.js,amazon-s3,file-upload,Javascript,Node.js,Amazon S3,File Upload,我试图使用一个预先签名的URL,但我一直得到一个403禁止访问被拒绝,尽管设置了我认为应该设置的所有内容。我想直接从浏览器上传一个文件到AmazonS3 我首先启用根AWS帐户使用putObject。我没有任何额外的帐户-我只想让它为我的根帐户开始工作。以下是bucket策略: { "Version": "2012-10-17", "Id": "XXXX", "Statement": [ { "Sid": "XXXXX",

我试图使用一个预先签名的URL,但我一直得到一个
403禁止访问被拒绝
,尽管设置了我认为应该设置的所有内容。我想直接从浏览器上传一个文件到AmazonS3

我首先启用根AWS帐户使用
putObject
。我没有任何额外的帐户-我只想让它为我的根帐户开始工作。以下是bucket策略:

{
    "Version": "2012-10-17",
    "Id": "XXXX",
    "Statement": [
        {
            "Sid": "XXXXX",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::XXXX:root"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::XXXXX/*"
        }
    ]
}
这是我的Node.js后端。在这里,我只是生成url并将其发送到前端。后端的一些代码:

const aws = require('aws-sdk');

aws.config.update({
  region: "eu-north-1",
  accessKeyId: "XXX",
  secretAccessKey: "YYY"
});

const s3 = new aws.S3({ apiVersion: "2006-03-01" });

app.get('/geturl', (req,res) => {

   const s3Params = {
      Bucket: 'XXXXXXXXXXXXX',
      Key: req.query.filename,
      Expires: 500,
      ContentType: req.query.type,
      ACL: "public-read"
   };

   s3.getSignedUrl("putObject", s3Params, (err, data) => {
      res.send(data);
   });

})

在前端,我使用URL和我想要上传的文件进行了一个简单的调用。当我执行第二次fetch调用时,它将生成错误:

async function handleUpload(e) {
     const file = e.target.files[0];

     const res = await fetch('http://localhost:3001/geturl');

     const url  = await res.text();

     const resUpload = await fetch(url, { method: 'PUT', body: file });


}

知道我做错了什么吗

编辑-如果我取消选中第一个复选框,它似乎可以工作-这是一个大问题还是应该总是在生产环境中阻止它?


在后端尝试将
ACL:“公共读取”
更改为
ACL:“私有”
。然后,您应该能够阻止所有公共访问,并且仍然能够成功完成预签名的put/post