【发布时间】:2011-04-23 19:08:52
【问题描述】:
我在 javascript 变量中有一个用 base64 编码的图像:data:image/png;base64, <em>base64 data</em>
[编辑] 我需要将该文件保存到磁盘而不要求访问者右键单击 [/编辑]
有可能吗?怎么样?
提前致谢
最好的问候
【问题讨论】:
-
你不能。你可以阅读这个post。
标签: javascript image save
我在 javascript 变量中有一个用 base64 编码的图像:data:image/png;base64, <em>base64 data</em>
[编辑] 我需要将该文件保存到磁盘而不要求访问者右键单击 [/编辑]
有可能吗?怎么样?
提前致谢
最好的问候
【问题讨论】:
标签: javascript image save
我知道这个问题已有 2 年历史了,但希望人们会看到此更新。
您可以提示用户将图像保存为 base64 字符串(并设置文件名),而无需要求用户执行右键单击
var download = document.createElement('a');
download.href = dataURI;
download.download = filename;
download.click();
例子:
var download = document.createElement('a');
download.href = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==';
download.download = 'reddot.png';
download.click();
为了使用 Firefox 触发点击事件,您需要按照this SO answer 中的说明进行操作。基本上:
function fireEvent(obj,evt){
var fireOnThis = obj;
if(document.createEvent ) {
var evObj = document.createEvent('MouseEvents');
evObj.initEvent( evt, true, false );
fireOnThis.dispatchEvent( evObj );
} else if( document.createEventObject ) {
var evObj = document.createEventObject();
fireOnThis.fireEvent( 'on' + evt, evObj );
}
}
fireEvent(download, 'click')
截至 2013 年 3 月 20 日,唯一完全支持 download 属性的浏览器是 Chrome。 Check the compatibility table here
【讨论】:
$(download).click()。如果您不使用 jQuery,请检查 this other SO question
...无需向访客询问任何内容...有可能吗?
不,那将是一个安全漏洞。如果可能的话,人们将能够在不经请求的情况下将恶意软件写入最终用户的磁盘。您最好的选择可能是(签名)Java Applet。诚然,签署它需要花费一点美元(这样它就不会弹出安全警告),但它能够在未经最终用户许可的情况下将数据写入最终用户的磁盘。
【讨论】:
我很惊讶这里没有人提到将 HTML5 blob 与几个不错的库一起使用。
您首先需要https://github.com/eligrey/FileSaver.js/ 和https://github.com/blueimp/JavaScript-Canvas-to-Blob。
然后您可以将图像加载到画布中
base_image = new Image();
base_image.src ='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==';
画布变成一个blob
var canvas = document.getElementById('YourCanvas');
context = canvas.getContext('2d');
// Draw image within
context.drawImage(base_image, 0,0);
最后保存
x_canvas.toBlob(function(blob) {
saveAs(blob, "screenshot.png");
}, "image/png");
FF 不完全受支持,但至少你会得到一个包含图像的单独页面。
看看这个:http://jsfiddle.net/khhmm/9/
编辑:这与 Safari / Mac 不兼容。
【讨论】:
正如其他答案已经说明的那样,您不能仅使用 javascript 来做到这一点。如果需要,可以将数据(使用普通 HTTP POST)发送到 PHP 脚本,调用 header('Content-type: image/png') 并使用 echo base64_decode($base64data) 将解码后的图像数据输出到页面。
这就像用户单击图像并打开它或提示他将文件保存到磁盘(普通浏览器的保存文件对话框)一样工作。
【讨论】:
这是不可能的。
如果是这样,浏览器将非常不安全,无需用户交互即可将随机数据写入您的硬盘。
【讨论】:
使用 javascript,你不能。我能想到的唯一真正的可能性是 java-applet,但也许(我不知道该图像应该保存多长时间)你可以简单地添加一个 img-tag 和 png 并 强制缓存(但如果用户删除了他的缓存,图片就会消失)。
【讨论】:
如果你使用 ActiveX,我认为 JavaScript 是可能的。
另一种可能性是让服务器使用不同的 mime 类型输出该文件,以便浏览器要求用户保存它。
【讨论】:
我认为你可以做一些事情(也许不仅需要 javascript...xul 编程)。有 Firefox 插件可以将图像保存到文件夹中(查看 Firefox 插件站点)
【讨论】:
您可以将此文件设置为服务器上的 blob,并使用 setTimeout 函数来触发下载。
【讨论】: