浏览器/HTML 强制从 src="data:image/jpeg;base64..." 下载图像

IT技术 javascript image html browser
2021-01-29 07:37:00

我在客户端生成一个图像,并用 HTML 显示它,如下所示:

<img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgM...."/>

我想提供下载生成的图像的可能性。

我怎么能意识到浏览器正在打开一个文件保存对话框(或者只是将像 chrome 或 firefox 这样的图像下载到下载文件夹就可以了),它允许用户保存图像而无需右键单击并另存为图像?

我更喜欢没有服务器交互的解决方案。所以我知道如果我先上传图像然后开始下载是可能的。

非常感谢!

4个回答

只需替换image/jpegapplication/octet-stream. 客户端不会将该 URL 识别为可内联资源,并提示下载对话框。

一个简单的 JavaScript 解决方案是:

//var img = reference to image
var url = img.src.replace(/^data:image\/[^;]+/, 'data:application/octet-stream');
window.open(url);
// Or perhaps: location.href = url;
// Or even setting the location of an <iframe> element, 

另一种方法是使用blob:URI:

var img = document.images[0];
img.onclick = function() {
    // atob to base64_decode the data-URI
    var image_data = atob(img.src.split(',')[1]);
    // Use typed arrays to convert the binary data to a Blob
    var arraybuffer = new ArrayBuffer(image_data.length);
    var view = new Uint8Array(arraybuffer);
    for (var i=0; i<image_data.length; i++) {
        view[i] = image_data.charCodeAt(i) & 0xff;
    }
    try {
        // This is the recommended method:
        var blob = new Blob([arraybuffer], {type: 'application/octet-stream'});
    } catch (e) {
        // The BlobBuilder API has been deprecated in favour of Blob, but older
        // browsers don't know about the Blob constructor
        // IE10 also supports BlobBuilder, but since the `Blob` constructor
        //  also works, there's no need to add `MSBlobBuilder`.
        var bb = new (window.WebKitBlobBuilder || window.MozBlobBuilder);
        bb.append(arraybuffer);
        var blob = bb.getBlob('application/octet-stream'); // <-- Here's the Blob
    }

    // Use the URL object to create a temporary URL
    var url = (window.webkitURL || window.URL).createObjectURL(blob);
    location.href = url; // <-- Download!
};

相关文件

我找不到相关的来源。顺便说一下,我还找到了这个答案,它建议了如何在 Chrome 中设置默认名称(仅限锚点,用户必须单击它)
2021-03-14 07:37:00
还找到了这个解决方案 - 现在似乎只有 chrome。谢谢你的支持!
2021-03-21 07:37:00
您是否认为第一种方法将被弃用,因为它不再适用于 chrome 19?
2021-03-30 07:37:00
出于某种原因,它在 Chrome 19.0 测试版中似乎被破坏了,但它适用于 Chrome 18 和 Firefox,所以我很好。是否可以设置文件名?
2021-04-06 07:37:00
无法在数据 URI 中设置文件名。即使使用画布/ Blob导出数据,也无法设置文件名。我在答案中添加了另一种方法(我想这个方法可以在 Chrome 19 中使用)。
2021-04-07 07:37:00

您可以在 a 标签上使用下载属性...

<a href="data:image/jpeg;base64,/9j/4AAQSkZ..." download="filename.jpg"></a>

查看更多:https : //developer.mozilla.org/en/HTML/element/a#attr-download

在 chrome 中,我无法使用此方法设置文件名。无论如何,下载文件的名称仍然是“下载”。这只发生在使用 data:image...
2021-03-17 07:37:00
动态生成图像源时如何使用此解决方案?我的意思是我有下载按钮,当用户点击它时,我会做一些计算,生成 base64 图像......我如何强制下载?
2021-03-29 07:37:00
在发表此评论时,该download属性仍不受 Safari 和 IE 支持。
2021-03-30 07:37:00
我知道这是一篇旧帖子,但根据 W3Schools 网站的说法,IE、Safari 和 Opera v. 不支持“下载”属性。< 12 w3schools.com/tags/tryit.asp?filename=tryhtml5_a_download2事实上我用 IE 和这是行不通的.... :(
2021-04-03 07:37:00
它有 base64 长度限制,您无法使用此方法下载更大的图像。
2021-04-06 07:37:00

我猜的IMG标签需要作为一个孩子一个标签,方式如下:

<a download="YourFileName.jpeg" href="data:image/jpeg;base64,iVBO...CYII=">
    <img src="data:image/jpeg;base64,iVBO...CYII="></img>
</a>

或者

<a download="YourFileName.jpeg" href="/path/to/OtherFile.jpg">
    <img src="/path/to/OtherFile.jpg"></img>
</a>

在最新版本的 Firefox 和 Chrome 中,仅使用#15 中解释a标签对我不起作用,但将相同的图像数据放在a.hrefimg.src标签中对我有用

从 JavaScript 可以这样生成:

var data = canvas.toDataURL("image/jpeg");

var img = document.createElement('img');
img.src = data;

var a = document.createElement('a');
a.setAttribute("download", "YourFileName.jpeg");
a.setAttribute("href", data);
a.appendChild(img);

var w = open();
w.document.title = 'Export Image';
w.document.body.innerHTML = 'Left-click on the image to save it.';
w.document.body.appendChild(a);
这并不是说它需要一个 img 标签,MSDN 文档指出只能使用已经下载的资源 - 只要您在任何地方拥有具有相同数据的图像:base64 就可以使用。msdn.microsoft.com/en-us/library/cc848897.aspx—— “出于安全原因,数据 URI 仅限于下载的资源。数据 URI 不能用于导航、脚本或填充框架或 iframe 元素。”
2021-04-11 07:37:00

看看FileSaver.js它提供了一个方便的saveAs功能,可以处理大多数浏览器特定的怪癖。