如何使用JavaScript将base64图像保存到用户的磁盘
How to save a base64 image to user's disk using JavaScript?
我已经使用JavaScript将源内容从<img>
html标签转换为base64String。图像显示得很清楚。现在我想使用javascript将图像保存到用户磁盘。
<html>
<head>
<script>
function saveImageAs () {
var imgOrURL;
embedImage.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA" +
"AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO" +
"9TXL0Y4OHwAAAABJRU5ErkJggg==";
imgOrURL = embedImage;
if (typeof imgOrURL == 'object')
imgOrURL = embedImage.src;
window.win = open(imgOrURL);
setTimeout('win.document.execCommand("SaveAs")', 0);
}
</script>
</head>
<body>
<a href="#" ONCLICK="saveImageAs(); return false" >save image</a>
<img id="embedImage" alt="Red dot">
</body>
</html>
当我将图像路径设置为<img>
html标记的源时,此代码运行良好。然而,当我传递源作为base64String不工作。
如何实现我想要的?
HTML5 download
attribute
只是为了允许用户下载图像或其他文件,您可以使用HTML5 download
属性。
静态文件下载
<a href="/images/image-name.jpg" download>
<!-- OR -->
<a href="/images/image-name.jpg" download="new-image-name.jpg">
动态文件下载
在动态请求图像的情况下,可以模拟这样的下载。
如果你的图片已经加载,并且你有base64
源,那么:
function saveBase64AsFile(base64, fileName) {
var link = document.createElement("a");
document.body.appendChild(link); // for Firefox
link.setAttribute("href", base64);
link.setAttribute("download", fileName);
link.click();
}
否则,如果图像文件下载为Blob
,您可以使用FileReader
将其转换为Base64:
function saveBlobAsFile(blob, fileName) {
var reader = new FileReader();
reader.onloadend = function () {
var base64 = reader.result ;
var link = document.createElement("a");
document.body.appendChild(link); // for Firefox
link.setAttribute("href", base64);
link.setAttribute("download", fileName);
link.click();
};
reader.readAsDataURL(blob);
}
Firefox 您正在创建的锚标记也需要添加到Firefox的DOM中,以便在单击事件(链接)中被识别。
不支持IE : Caniuse link
在JavaScript中,您不能直接访问文件系统。但是,您可以使浏览器弹出一个对话框窗口,允许用户选择保存位置。为了做到这一点,使用replace
方法与Base64String并用"image/octet-stream"
替换"image/png"
:
"data:image/png;base64,iVBORw0KG...".replace("image/png", "image/octet-stream");
同样,兼容w3c的浏览器提供了2种方法来处理base64编码和二进制数据:
- atob ()
- btoa ()
也许,你会发现它们在某种程度上很有用…
这是我理解你需要的重构版本:
window.addEventListener('DOMContentLoaded', () => {
const img = document.getElementById('embedImage');
img.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA' +
'AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO' +
'9TXL0Y4OHwAAAABJRU5ErkJggg==';
img.addEventListener('load', () => button.removeAttribute('disabled'));
const button = document.getElementById('saveImage');
button.addEventListener('click', () => {
window.location.href = img.src.replace('image/png', 'image/octet-stream');
});
});
<!DOCTYPE html>
<html>
<body>
<img id="embedImage" alt="Red dot" />
<button id="saveImage" disabled="disabled">save image</button>
</body>
</html>
This Works
function saveBase64AsFile(base64, fileName) {
var link = document.createElement("a");
document.body.appendChild(link);
link.setAttribute("type", "hidden");
link.href = "data:text/plain;base64," + base64;
link.download = fileName;
link.click();
document.body.removeChild(link);
}
根据上面的答案,但做了一些改变
查看https://github.com/eligrey/FileSaver.js/,它包装了HTML5方法,并提供了变通方法,例如IE10
相关文章:
- 从远程脚本获取用户IP
- 如何通过自己获得Chrome扩展的用户反馈/错误报告
- d3基于用户选择动态更新节点
- 同步调用,直到用户通过angular验证为访问者
- 使用javascript搜索具有用户输入的数组
- 如何使用jquery确定用户是否年满18岁
- Meteor-添加用户自定义字段的方法不起作用
- React Native通过Navigator将用户输入数据传递到选项卡栏IOS中的组件
- 跟踪用户点击Adsense广告的IP地址
- 使用javascript反复检查用户在facebook上的登录状态
- 我想在AngularJS应用程序中创建一个输入数字框,用户不应该在该框上键入十进制数字.(一个整数输入框)
- 如何检查用户在html5视频播放器中观看了完整的视频
- 一个密码测试程序,如果存在空格,它会提醒用户
- 如何使用JavaScript中的用户输入创建序列/序列
- 当用户按下回车键时,自动在text区域/text中插入消息
- 显示某个用户ID的某个标签的30张Instagram图片
- 将当前用户的 ID 推送到 meteorjs 中集合/文档的内部数组
- 如何使用summernote获取用户插入的图像,并用PHP将其上传到磁盘上
- 如何使用JavaScript将base64图像保存到用户的磁盘
- 在我的Python CGI脚本中,我如何将用户在表单中输入的数据通过POST请求上传的文件保存到磁盘