Ich antworte auf dieses Thema, obwohl es einige Jahre alt ist, weil die jüngste Konvergenz der Webbrowser bei der Unterstützung von SVG und anderen relevanten Verhaltensweisen ein erneutes Interesse an SVG hervorgerufen hat und eine "universelle" Antwort auf die Frage ermöglicht. Im Wesentlichen ist der Ansatz von zneak richtig, aber meiner Meinung nach knapp (dh ich habe eine Weile gebraucht, um ihn für mich selbst zum Laufen zu bringen). Ich denke auch, dass sein Verweis auf AJAX entweder unnötig ist oder nicht das, was ich unter AJAX verstehe (= verwendet eine XMLHttpRequest). Ich werde daher eine detailliertere Antwort mit reinem JavaScript (dh ohne JQuery oder eine andere Bibliothek) geben und Servercode für Java, Perl und PHP bereitstellen.
(1) Lassen Sie den (dynamisch generierten) SVG-Inhalt in Ihrer HTML-Seite in einem div mit einer eindeutigen ID einschließen, z
<div id="svg"><svg...>SVG content</svg></div>
(2) Fügen Sie eine Schaltfläche zum Aufrufen der JavaScript-Funktion hinzu, z
<button onclick="sendSVG();">Save as SVG File</button>
(3) Fügen Sie die angegebene JavaScript-Funktion in Ihr Schaltflächen-Markup ein:
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) Schreiben Sie eine Server-App, um Ihre SVGtext-Post-Anfrage zu akzeptieren, und geben Sie sie als image / svg + xml zurück, indem Sie Content-Disposition verwenden, um einen Anhang anzugeben. Arbeitscode in drei Sprachen wird vorgestellt, obwohl ich kein Perl-Programmierer bin und PHP noch nie im Zorn benutzt habe.
Java Servlet
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);
}
Perl CGI
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";
?>
Ich habe hier einen fest codierten Namen für das Bild verwendet (image.svg), aber tatsächlich einen Diskriptor des dynamischen Inhalts aufgenommen, den ich von der Seite generiere (wieder mit einem div und einer ID und document.getElementById('graphName').textContent
).
Dies wurde auf Mac Safari 9, Firefox 42, Chrome 47, Opera 34 und Windows 7 / IE 11 sowie Windows 10 / Edge getestet. In jedem Fall wird die SVG-Datei heruntergeladen oder einer wird aufgefordert, sie herunterzuladen. Die resultierenden Dateien werden in Adobe Illustrator oder einer anderen Anwendung geöffnet, die Sie zum Öffnen von SVG-Dateien festgelegt haben.
Ein reales Beispiel hierfür (wenn Sie die akademische Forschung als real betrachten) finden Sie unter http://flyatlas.gla.ac.uk/MidgutAtlas/index.html im Abschnitt Gene.