我曾经只需在锚元素中添加一个download
属性即可下载图像,并在 href 属性上添加图像路径。
<a href="https://s3.amazonaws.com/..../Producer.png" download>Download</a>
现在,随着chrome最新更新与cors(跨源资源共享(,图像将在新选项卡中打开。
我对谷歌做了各种研究,包括stackoverflow本身。但他们都没有帮助我。这不是可以从存储桶下载图像s3
吗?
我也启用了来自 aws 的 cors。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
现在我正在使用这个函数来接受网址和文件名
function forceDownload(url, fileName){
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.responseType = "blob";
xhr.onload = function(){
var urlCreator = window.URL || window.webkitURL;
var imageUrl = urlCreator.createObjectURL(this.response);
var tag = document.createElement('a');
tag.href = imageUrl;
tag.download = fileName;
document.body.appendChild(tag);
tag.click();
document.body.removeChild(tag);
}
xhr.send();
}
并在 OnClick 事件中使用了此函数。
<div class="download-icon" onclick="forceDownload('https://s3.amazonaws.com/.../images.jpg','images.jpg')"> Download</div>
还尝试使用文件保护程序.js
function forceDownload(url, fileName){
var xhr = new XMLHttpRequest()
xhr.open('GET', url)
xhr.responseType = 'blob'
xhr.onload = function() {
saveAs(xhr.response, fileName);
}
xhr.send()
}
注意:通过所有这些函数实现,我得到了部分结果。 仅下载 2 或 3 张图像,然后开始显示与 CORS 相关的问题。
试试这个:
let forceDownload = url => {
let urlArray = url.split("/")
let bucket = urlArray[3]
let key = `${urlArray[4]}/${urlArray[5]}`
let s3 = new AWS.S3({ params: { Bucket: bucket }})
let params = {Bucket: bucket, Key: key}
s3.getObject(params, (err, data) => {
let blob=new Blob([data.Body], {type: data.ContentType});
let link=document.createElement('a');
link.href=window.URL.createObjectURL(blob);
link.download=url;
link.click();
})
}
url 参数是指图像的完整 url。
您还需要aws-sdk
。
在 S3 存储桶中找到要使用的文件并单击它。
点击"属性"选项卡
点击显示"元数据">
的框单击内容类型左侧的圆圈,然后单击"添加元数据">
将"键"设置为"内容处置",并将值设置为"附件"并点击保存。
这将强制下载它,而不是在您的浏览器中播放或显示。
对于用于上传到 s3 的任何后端方法,请确保 ContentDisposition='attachment',您还需要验证您的 href 不是用 http 命名的:它必须是 https: