80 votes

Comment enregistrer un canevas svg dans le système de fichiers local ?

Existe-t-il un moyen de permettre à un utilisateur, après avoir créé un graphique vectoriel sur un canevas svg en javascript à l'aide d'un navigateur, de télécharger ce fichier sur son système de fichiers local ?

SVG est un domaine totalement nouveau pour moi, alors soyez patient si ma formulation n'est pas exacte.

0 votes

J'ai répondu à une question similaire de manière plus détaillée ici : stackoverflow.com/questions/8379923/

0 votes

J'ai enfin une implémentation qui fonctionne : iscriptdesign.com . Choisissez l'exportation svg. Vérifié pour les derniers Firefox et chrome

0 votes

Il existe des extensions de navigateur qui permettent de télécharger des fichiers SVG. Certaines d'entre elles conservent également les informations de style.

64voto

The Who Points 3724

Vous pouvez éviter un aller-retour vers le serveur.

Encodez votre SVG xml en base64.

Créez ensuite un lien vers ces données. L'utilisateur peut faire un clic droit dessus pour l'enregistrer localement.

// 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>"));
}

La balise img fonctionne dans Webkit, le lien fonctionne dans Webkit & Firefox, et peut fonctionner dans n'importe quel navigateur qui supporte data-uri

2 votes

Où se trouve Base64 proviennent-ils ?

6 votes

Cet exemple utilise la bibliothèque de webtoolkit.info/javascript-base64.html

0 votes

C'est la solution la plus propre et presque travaux : Chrome affiche correctement l'image à partir du data-uri, mais ne permet pas de l'enregistrer ! Firefox est pire, car il déforme les données d'une manière ou d'une autre. soupir

19voto

Eli Grey Points 17553

Utilisation de FileSaver.js

saveAs(new Blob([SVG_DATA_HERE], {type:"image/svg+xml"}), "name.svg")

1 votes

En quoi cela répond-il à la question ? Il ne s'agit pas d'enregistrer le SVG sur le système de fichiers local, n'est-ce pas ?

1 votes

Scott : Cela ouvre le SVG dans sa propre page, où l'utilisateur peut le sauvegarder lui-même dans son système de fichiers.

0 votes

Lorsque je l'essaie, j'obtiens l'erreur suivante : "Cette page contient les erreurs suivantes : erreur sur la ligne 1 à la colonne 1 : le document est vide" - mais l'erreur est peut-être de mon côté. Je sais que j'envoie les bonnes données, donc je ne sais pas dont C'est une erreur.

15voto

zneak Points 45458

Il serait possible d'utiliser la commande ordinaire "Enregistrer" du navigateur, mais cela n'enregistrerait pas seulement le canevas SVG, mais la page entière.

Je crois que votre meilleure chance est d'utiliser AJAX et d'envoyer l'ensemble des données SVG XML comme données POST à un serveur script, et que ce script renvoie simplement les données POST avec l'en-tête Content-Disposition: attachment; filename=yourfile.svg .

(Sous PHP, vous pouvez obtenir le contenu brut du POST avec file_get_contents('php://input') .)

0 votes

Comment devons-nous traiter la réponse dans ce cas ?

11voto

dr jerry Points 2054

Avec FileSaver d'Eli Grey, j'ai réussi à le faire fonctionner (chrome) :

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 vient de keith woods jquery's svg.

Html Rocks 1

Html Rocks 2

2voto

Nood Points 21

Oui, c'est possible. Utilisez jquery.svg http://keith-wood.name/svgRef.html et envoyez les données xml svg en utilisant la fonction svg.toSVG() (en les écrivant dans un champ caché lors de la soumission). Demandez à php de sauvegarder et de convertir en image matricielle en utilisant imagemagick (convertir image.svg image.png) puis de forcer le téléchargement du fichier en utilisant header("Content-Type : application/octet-stream") et de lire le fichier de l'image.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X