Estoy respondiendo a este tema, aunque tiene algunos años, porque la reciente convergencia de navegadores web en su soporte para SVG y otros comportamientos relevantes ha generado un renovado interés en SVG y permite una respuesta 'universal' a la pregunta. En esencia, el enfoque de zneak es correcto pero, en mi opinión, conciso (es decir, me tomó un tiempo hacerlo funcionar por mí mismo). También creo que su referencia a AJAX es innecesaria o no es lo que entiendo por AJAX (= usa XMLHttpRequest). Por lo tanto, proporcionaré una respuesta más detallada utilizando JavaScript puro (es decir, sin JQuery o cualquier otra biblioteca) y proporcionaré código de servidor para Java, Perl y PHP.
(1) Incluya el contenido SVG (generado dinámicamente) en su página HTML en un div con una ID única, p. Ej.
<div id="svg"><svg...>SVG content</svg></div>
(2) Incluya un botón para invocar la función de JavaScript, p. Ej.
<button onclick="sendSVG();">Save as SVG File</button>
(3) Incluya la función de JavaScript nombrada en el marcado de su botón:
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) Escriba una aplicación de servidor para aceptar su solicitud de publicación SVGtext y devolverla como image / svg + xml usando Content-Disposition para especificar un archivo adjunto. Se presenta código de trabajo en tres idiomas, aunque no soy un programador de Perl y nunca he usado PHP con rabia.
Servlet de 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);
}
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";
?>
He usado un nombre codificado para la imagen aquí (image.svg), pero en realidad seleccioné un descriptor del contenido dinámico que genero de la página (usando un div y una ID nuevamente, y document.getElementById('graphName').textContent
).
Esto se ha probado en Mac Safari 9, Firefox 42, Chrome 47, Opera 34 y Windows7 / IE 11 y Windows10 / Edge y, en cada caso, se descarga el archivo svg o se le solicita que lo descargue. Los archivos resultantes se abrirán, por ejemplo, en Adobe Illustrator o en cualquier otra aplicación que haya configurado para abrir archivos svg.
Un ejemplo del mundo real de esto (si considera la investigación académica del mundo real) está en http://flyatlas.gla.ac.uk/MidgutAtlas/index.html en la sección Gen.