基本上,我使用的是一个名为HTML2Canvas
这是我当前的代码工作得很好,正在从按钮的onclick
事件中调用:
function saveForm()
{
html2canvas(document.body, {
onrendered: function(canvas) {
document.body.appendChild(canvas);
}
});
}
基本上,它所做的就是拍摄一个屏幕截图并将其附加到页面底部。
虽然答案不起作用且下载始终是一个损坏的jpg文件,但已经存在类似的问题了: html2canvas saving as a jpeg without opening in browser
是否有办法在此功能中强制下载而不是将其附加到页面底部?
答案 0 :(得分:1)
canvas.toDataURL
将画布内容作为图像src <img>
src
function saveForm() {
html2canvas(document.body, {
onrendered: function(canvas) {
var img = canvas.toDataURL("image/png");
var open = window.open('','','width=500,height=500')
open.document.write('<img id="img" style="width="400">');
open.document.getElementById('img').setAttribute('src', img);
}
});
}
在onrendered
内测试代码,它确实有效 - 但不与html2canvas一起使用。
如果您右键点击弹出窗口中的图片 - &gt;保存图像为,保存的图像有效。
我使用setAttribute
而不仅仅是src="..."
的原因是,如果您将数据src指定为字符串,则图像会损坏。
修改强>
我知道:(我认为你必须设置HTTP标头强制下载,这只能由服务器完成(如果我错了就纠正我)。我想在服务器上的“代理”就像这个模型,下载.php:
<?
$src=$_POST['src'];
header('Content-Type: image/png');
header('Content-Disposition: inline; filename="download.png"');
header('Content-Length: '.count($src));
echo $src;
?>
并通过
调用它var img = canvas.toDataURL("image/png");
window.open('download.php?src='+img);
但是你会面对很多Request-URI Too Large
- 消息,除非你的所有画布图像都是图标大小。
第二种方式 - 也许是可行的方法 - 将通过ajax将img
保存在服务器上的表中,例如使用保存它的img src调用脚本。完成此调用后,您可以使用正确的图像下载标题调用另一个服务器脚本,包括之前保存的img src。但这是一种你可以尝试的更广泛的方法..?
答案 1 :(得分:0)
这是一个建立在公认的解决方案之上的解决方案,它无需使用 jQuery 的服务器端代码即可启用下载按钮。
https://codepen.io/nathansouza/pen/OXdJbo
function download(url){
var a = $("<a style='display:none' id='js-downloder'>")
.attr("href", url)
.attr("download", "test.png")
.appendTo("body");
a[0].click();
a.remove();
}
function saveCapture(element) {
html2canvas(element).then(function(canvas) {
download(canvas.toDataURL("image/png"));
})
}
$('#btnDownload').click(function(){
var element = document.querySelector("#capture");
saveCapture(element)
})