Я відповідаю на цю тему, хоча їй вже кілька років, тому що нещодавнє зближення веб-браузерів у підтримці SVG та іншої відповідної поведінки викликало відновлений інтерес до SVG і дозволяє отримати "універсальну" відповідь на питання. По суті, підхід zneak правильний, але, на мій погляд, стислий (тобто мені знадобився час, щоб він працював на мене). Я також думаю, що його посилання на AJAX або непотрібне, або не те, що я розумію під AJAX (= використовує XMLHttpRequest). Тому я надам більш детальну відповідь із використанням чистого JavaScript (тобто без JQuery чи будь-якої іншої бібліотеки) та надам серверний код для Java, Perl та PHP.
(1) Нехай (динамічно генерований) вміст SVG на вашій HTML-сторінці буде укладений у div з унікальним ідентифікатором, наприклад
<div id="svg"><svg...>SVG content</svg></div>
(2) Додайте кнопку для виклику функції JavaScript, наприклад
<button onclick="sendSVG();">Save as SVG File</button>
(3) Включіть функцію JavaScript, названу у вашій розмітці кнопок:
function sendSVG()
{
var svgText = document.getElementById('svg').innerHTML;
var form = document.createElement("form");
form.setAttribute("method", "post");
form.setAttribute("action", "http://path-to-your-server-app");
form.setAttribute("accept-charset", "UTF-8");
var hiddenSVGField = document.createElement("input");
hiddenSVGField.setAttribute("type", "hidden");
hiddenSVGField.setAttribute("name", "svgText");
hiddenSVGField.setAttribute("value", svgText);
form.appendChild(hiddenSVGField);
document.body.appendChild(form);
form.submit();
}
(4) Напишіть серверну програму, щоб прийняти ваш запит на публікацію у SVGtext і повернути як image / svg + xml, використовуючи Content-Disposition, щоб вказати вкладення. Представлено робочий код трьома мовами, хоча я не програміст Perl і ніколи не використовував PHP в гніві.
Сервлет Java
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String svgText = (String) request.getParameter("svgText");
response.setContentType("image/svg+xml");
response.addHeader("Content-Disposition", "attachment; filename=\"image.svg\"");
PrintWriter out = response.getWriter();
out.println(svgText);
}
CGI Perl
use CGI qw(:standard);
my $svgText = param('svgText');
print header(-type => "image/svg+xml",
-content_disposition => "attachment; filename=image.svg");
print $svgText;
PHP
<?php
$svgText = $_POST['svgText'];
header('Content-type: image/svg+xml');
header('Content-Disposition: attachment; filename="image.svg"');
print "$svgText";
?>
Я використовував жорстко закодовану назву для зображення тут (image.svg), але насправді підбираю дискриптор динамічного вмісту, який я генерую зі сторінки (знову використовуючи div та ідентифікатор, і document.getElementById('graphName').textContent
).
Це було протестовано на Mac Safari 9, Firefox 42, Chrome 47, Opera 34 та Windows7 / IE 11 та Windows10 / Edge, і в кожному випадку файл svg завантажується або пропонується завантажити його. Отримані файли відкриються в, наприклад, Adobe Illustrator або будь-якій іншій програмі, яку ви встановили для відкриття файлів svg.
Реальний приклад цього (якщо ви вважаєте академічні дослідження реальними) знаходиться на веб-сайті http://flyatlas.gla.ac.uk/MidgutAtlas/index.html у розділі «Ген».