我有一个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
除了用户代理之外,工作机器的请求头是相同的。
3条答案
按热度按时间dgiusagp1#
尝试更换
与
c86crjj02#
通过将CORS配置添加到我的桶中,CORS错误已删除,但仍然无法下载映像。
我尝试了不同的解决方案,但这些步骤对我有效。你应该试试这些步骤。
**1.**在您的铲斗上添加CORS配置。
**2.将交叉源=“任何名称”**添加到img标签
**3.**JS代码
vsmadaxz3#
AllowedOrigins不接受通配符。必须列出主域URL。