rad*_*ast 6 html javascript download href
我想制作一个<a href链接,点击后会强制浏览器打开“另存为”对话框。HTML5download属性的使用应该在所有现代浏览器上都有这种行为。
当目标是外部托管的图像文件时,这不起作用。该<a href链接将导航到图像而不是下载它。(使用 Imgur 和 Tumblr 上托管的图像进行测试)

<a href="https://i.stack.imgur.com/440u9.png" download>
<img src="https://i.stack.imgur.com/440u9.png" width="200"/>
</a>
Run Code Online (Sandbox Code Playgroud)
例如,如果图像本地托管在您的服务器上,类似的 HTML 代码确实有效
<a href="440u9.png" download>
<img src="440u9.png" width="200"/>
</a>
Run Code Online (Sandbox Code Playgroud)
另一个例子 - 这将在W3Schools Tryit Editor 中工作,但如果您将 HTML 复制到另一个沙箱(如 JSFiddle)中将不起作用
<a href="https://www.w3schools.com/images/myw3schoolsimage.jpg" download>
<img src="https://www.w3schools.com/images/myw3schoolsimage.jpg" width="104" height="142">
</a>
Run Code Online (Sandbox Code Playgroud)
探讨的可能原因:
https:如果 URL 指向同一个域,则带有的 URL 很好,在 W3Schools Tryit Editor 中进行了测试http://...链接可以重定向到,https://...所以这可能是失败的原因,但https://...链接也不起作用任何解决方法?我尝试过此处和此处讨论的 Javascript 下载方法,但这些方法最终都涉及类似于单击href链接的浏览器操作。
对下载链接的深入讨论,包括application/force-download在服务器上的 PHP 设置
相关 StackOverflow 问题:Force external download url(答案似乎不正确)
我的解决方法:将图像下载到画布,然后将画布图像下载到本地驱动器。
代码:
<canvas id="downloadCanvas"></canvas>
<script>
var strDataURI = "https://78.media.tumblr.com/33f1b72778ca7352979b0f4555f08f02/tumblr_pfega8eUyH1r68v93o1_640.jpg";
var img = new Image;
img.crossOrigin = "Anonymous";
img.src = strDataURI;
var canvas = document.getElementById('downloadCanvas');
var ctx = canvas.getContext('2d');
img.onload = function(){
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img,0,0);
var dwBtn = document.getElementById("dw0");
var dwLink = canvas.toDataURL('image/jpeg', 1.0);
download(dwLink, "image.jpeg");
};
function download(dataurl, filename) {
var a = document.createElement("a");
a.href = dataurl;
a.setAttribute("download", filename);
var b = document.createEvent("MouseEvents");
b.initEvent("click", false, true);
a.dispatchEvent(b);
return false;
}
</script>
Run Code Online (Sandbox Code Playgroud)
正如OP所要求的,他需要捕获的图像具有相同的扩展名。(伪代码)
更改这些行:
var ext = ExtensionFromUrl(url);
var fileName = NameFromUrl(url);
var dwLink = canvas.toDataURL('image/'+ext, 1.0);
download(dwLink, fileName+"."+ext);
Run Code Online (Sandbox Code Playgroud)
请注意:此答案不适用于 GIF 图像。此外,由于它们是捕获的图像,透明通道将会丢失!
| 归档时间: |
|
| 查看次数: |
7270 次 |
| 最近记录: |