如何将 svg 画布保存到本地文件系统

IT技术 javascript svg save filesystems local
2021-01-28 14:10:39

有没有办法允许用户在使用浏览器在 javascript svg 画布上创建矢量图后,将此文件下载到他们的本地文件系统?

SVG 对我来说是一个全新的领域,所以如果我的措辞不准确,请耐心等待。

6个回答

您可以避免往返服务器。

Base64 编码您的 SVG xml。

然后生成指向该数据的链接。用户可以右键单击以将其保存在本地。

// This example was created using Protovis & jQuery
// Base64 provided by http://www.webtoolkit.info/javascript-base64.html
// Modern web browsers have a builtin function to this as well 'btoa'
function encode_as_img_and_link(){
 // Add some critical information
 $("svg").attr({ version: '1.1' , xmlns:"http://www.w3.org/2000/svg"});

 var svg = $("#chart-canvas").html();
 var b64 = Base64.encode(svg); // or use btoa if supported

 // Works in recent Webkit(Chrome)
 $("body").append($("<img src='data:image/svg+xml;base64,\n"+b64+"' alt='file.svg'/>"));

 // Works in Firefox 3.6 and Webit and possibly any browser which supports the data-uri
 $("body").append($("<a href-lang='image/svg+xml' href='data:image/svg+xml;base64,\n"+b64+"' title='file.svg'>Download</a>"));
}

img 标签在 Webkit 中有效,链接在 Webkit 和 Firefox 中有效,并且可以在任何支持 data-uri

此示例使用来自webtoolkit.info/javascript-base64.html的库
2021-03-30 14:10:39
如果文本包含 Unicode 字符,请使用btoa(unescape(encodeURIComponent(svg)))-no libraries required。
2021-03-30 14:10:39
这完全是最干净的解决方案,它几乎可以工作:Chrome 正确显示来自 data-uri 的图像,但它不允许您保存!Firefox 更糟,因为它以某种方式乱码数据。
2021-04-02 14:10:39
哪里Base64来的呢?
2021-04-06 14:10:39
使用 HTML5,您还可以将download属性添加到您的链接,这对用户来说更容易一些。在这里查看更多信息
2021-04-07 14:10:39

使用FileSaver.js

saveAs(new Blob([SVG_DATA_HERE], {type:"image/svg+xml"}), "name.svg")
这如何回答问题?它没有将 SVG 保存在本地文件系统上,是吗?
2021-03-18 14:10:39
Scott:这会在其自己的页面中打开 SVG,用户可以在其中自行将其保存到他们的文件系统中。
2021-03-21 14:10:39
@yckart:document.getElementsByTagName("svg")[i].parentNode.innerHTML,其中i是document.get返回的HTMLCollectionr中要导出的svg的key...,如果你只有一个svn标签在页面中然后 i=0。
2021-04-05 14:10:39
当我尝试时,我收到以下错误:“此页面包含以下错误:第 1 行第 1 列错误:文档为空” - 但错误可能在我这边。我知道我输入了正确的数据,所以我不知道哪个错误。
2021-04-09 14:10:39
我怎样才能提取SVG_DATAdocument.getElementsByTagName("svg")<something to get the data>
2021-04-09 14:10:39

无需进行 base64 编码 - 您可以在其中创建包含原始 SVG 代码的链接。这是 The_Who 的回答中修改后的功能 encode_as_img_and_link() :

function img_and_link() {
  $('body').append(
    $('<a>')
      .attr('href-lang', 'image/svg+xml')
      .attr('href', 'data:image/svg+xml;utf8,' +  unescape($('svg')[0].outerHTML))
      .text('Download')
  );
}
对我来说,当源 svg 有一个以“#”结尾的 xmlns URL 时,这会中断。
2021-03-29 14:10:39
这个答案应该被赞成。的第二个参数.attr('href', ...)实际上是原始<svg>...</svg>代码。适用于 Chrome 和 Safari,但我还没有让它在 Edge 上工作。IE 似乎不能一刀切。
2021-04-01 14:10:39

可能可以使用常规的“保存”浏览器命令,但它不仅会保存 SVG 画布,还会保存整个页面。

我相信您最好的选择是使用 AJAX 并将整个 SVG XML 数据作为 POST 数据发送到服务器脚本,并让该脚本仅将带有 header 的 POST 数据发送回Content-Disposition: attachment; filename=yourfile.svg

(在 PHP 下,您可以使用file_get_contents('php://input').获取原始 POST 内容。)

在这种情况下,我们应该如何处理响应?
2021-04-09 14:10:39

使用Eli Gray 的FileSaver,我让它工作了(镀铬):

bb = new window.WebKitBlobBuilder;
var svg = $('#designpanel').svg('get');
bb.append(svg.toSVG());
var blob = bb.getBlob("application/svg+xml;charset=" + svg.characterSet);
saveAs(blob,"name.svg");

SVG 来自基思伍兹 jquery 的 svg。

Html 摇滚 1

Html 摇滚 2