typescript 从一台机器上运行的浏览器下载S3图像,并在另一台机器上给出CORS错误

xxb16uws  于 2023-02-10  发布在  TypeScript
关注(0)|答案(3)|浏览(151)

我有一个Angular2应用程序,我试图从S3下载一组图像,并将它们放在一个zip文件中。我使用的是从https://gist.github.com/noelvo/4502eea719f83270c8e9获得的以下代码

dlImages(urlList, jobName) {

    var zip = new JSZip();
    var count = 0;
    var zipFilename = jobName.split(" ").join("_") + ".zip";
    var img = zip.folder("images");

    console.log(zipFilename);

    urlList.forEach(function (url, idx) {
        //filename and file type should be the same it is in s3
        var fileExtension = url.split('.').pop(-1);
        var realIdx = idx + 1;
        var filename = realIdx.toString().concat(".").concat(fileExtension);
        console.log(url);
        console.log(filename);

        JSZipUtils.getBinaryContent(url, function (err, data) {
            if (err) {
                throw err; // or handle the error
            }
            img.file(filename, data, {binary: true});
            count++;

            if (count == urlList.length) {
                zip.generateAsync({type: 'blob'}).then(function (content) {
                    FileSaver.saveAs(content, zipFilename);
                });
            }
        });
    });
}

代码在Heroku应用程序上运行,奇怪的是,它在我的开发机器(chrome版本68.0.3440.106)上按预期工作,但在另一台机器(chrome版本69.0.3497.100)上却出现CORS错误。

Failed to load url.for.image.in.s3.jpg: No 'Access-Control-Allow-Origin' header is present on the requested resource.  Origin 'https://myherokuapp.herokuapp.com' is therefore not allowed access.

对于集合中的每个图像url,都会抛出上述错误。

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>https://*</AllowedOrigin>
    <AllowedOrigin>http://*</AllowedOrigin>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

另外,在我的app.js文件中,我有

app.use(function (req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
    res.setHeader('Access-Control-Allow-Methods', 'POST, GET, PATCH, DELETE, OPTIONS');
    next();
});

有人知道为什么此CORS策略会出现此CORS错误吗?接下来的问题是,为什么此错误在一台计算机上有效,而在另一台计算机上无效?
编辑:
下面是尝试下载映像时每台计算机的响应头的屏幕截图。
这是运行

的计算机的响应标头
这里是不工作的机器的响应标头

很明显,不同之处在于无法工作的机器的响应头没有ACCESS-CONTROL-ALLOW字段,但我不知道为什么会发生这种情况。我会做一些研究,但如果有人知道这将是非常有帮助的。
第二次编辑:
这里还有一个不工作的机器的请求标头

Origin: https://xxxxx.herokuapp.com

Referer: https://xxxxx.herokuapp.com/yyyyyyyy/5ac2635557c3f70014529d4d

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36

除了用户代理之外,工作机器的请求头是相同的。

dgiusagp

dgiusagp1#

尝试更换

<AllowedOrigin>https://*</AllowedOrigin>
<AllowedOrigin>http://*</AllowedOrigin>

<AllowedOrigin>*</AllowedOrigin>
c86crjj0

c86crjj02#

通过将CORS配置添加到我的桶中,CORS错误已删除,但仍然无法下载映像。
我尝试了不同的解决方案,但这些步骤对我有效。你应该试试这些步骤。

**1.**在您的铲斗上添加CORS配置。

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

**2.交叉源=“任何名称”**添加到img标签

<img crossorigin="anonymous" id="media_img" src="example.jpeg">

**3.**JS代码

$('#media_img').on('click', () => {
    downloadImage();
  })
 
  function toDataURL(url) {
    return fetch(url).then((response) => {
      return response.blob();
    }).then(blob => {
      return URL.createObjectURL(blob);
    });
  }

  async function downloadImage() {
    const a = document.createElement('a');
    a.href = await toDataURL($('#media_img').attr('src'));
    a.download = 'example.jpeg';
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
  }
vsmadaxz

vsmadaxz3#

AllowedOrigins不接受通配符。必须列出主域URL。

"AllowedOrigins": [
     "https://your.domain.com"
        ]

相关问题