Pourquoi n'toile.toDataURL() lancer une exception de sécurité?
N'ai-je pas obtenir suffisamment de sommeil ou quoi? Ce code suivant
var frame=document.getElementById("viewer");
frame.width=100;
frame.height=100;
var ctx=frame.getContext("2d");
var img=new Image();
img.src="http://www.ansearch.com/images/interface/item/small/image.png"
img.onload=function() {
//draw image
ctx.drawImage(img, 0, 0)
//Here's where the error happens:
window.open(frame.toDataURL("image/png"));
}
est de lancer cette erreur:
SECURITY_ERR: DOM Exception 18
Il n'y a aucune façon cela ne devrait pas fonctionner! Quelqu'un peut-il expliquer cela, s'il vous plaît?
- Voir ici pour une solution: Comment utiliser de la toile.toDataURL() pour obtenir base64 de l'image dans Adobe AIR?
- Cette solution ne semble pas utile pour ceux qui n'utilisent pas Adobe AIR.
Vous devez vous connecter pour publier un commentaire.
Dans le spécifications il dit:
Si l'image provient d'un autre serveur, je ne pense pas que vous pouvez utiliser toDataURL()
Réglage de l'origine de la croix de l'attribut sur les objets de l'image a fonctionné pour moi (j'ai été en utilisant fabricjs)
Pour ceux qui utilisent fabricjs, voici la façon de corriger l'Image.fromUrl
Si l'image est hébergée sur un ordinateur hôte qui définit soit de Access-Control-Allow-Origin ou Access-Control-Allow-les informations d'Identification, vous pouvez utiliser de la Croix-Origin Resource sharing (SCRO). Voir ici (la crossorigin attribut) pour plus de détails.
Votre autre option est de votre serveur pour avoir un point de terminaison qui récupère et sert une image. (eg. http://your_host/endpoint?url=URL)
L'inconvénient de cette approche étant de latence et théoriquement inutile de la chercher.
S'il y a plus d'autres solutions, je serais intéressé à entendre parler d'eux.
Semble qu'il y est un moyen de prévenir que si d'hébergement d'images en mesure de fournir les en-têtes HTTP suivant pour l'image des ressources et le navigateur prend en charge la SCRO:
Il est dit ici: http://www.w3.org/TR/cors/#use-cases
J'ai enfin trouvé la solution. Juste besoin d'ajouter le
crossOrigin
comme troisième paramètre dansfromURL
funcJ'ai eu le même problème et toutes les images sont hébergées dans le même domaine... Donc, si quelqu'un a le même problème, voici comment j'ai résolu:
J'ai eu deux boutons: l'un pour générer de la toile et un autre pour générer l'image de la toile. Il n'a travaillé que pour moi, et désolé que je ne sais pas pourquoi, quand j'ai écrit tout le code sur le premier bouton. Alors, quand je clique il génère de la toile et l'image en même temps...
J'ai toujours ce problème de sécurité lorsque les codes ont été sur différentes fonctions... =/
J'ai été capable de le faire fonctionner à l'aide de ceci:
Écrire sur la première ligne de votre
.htaccess
sur votre serveur sourcePuis lors de la création d'un
<img>
élément, procédez comme suit:Vous ne pouvez pas mettre des espaces dans votre ID
Mise à jour
Ma conjecture est que l'image est sur un serveur différent de celui où vous êtes à l'exécution du script. J'ai été en mesure de reproduire votre erreur lors de l'exécution sur ma propre page, mais il a bien fonctionné le moment j'ai utilisé une image hébergée sur le même domaine. Il est donc lié à la sécurité - mettre l'image sur votre site. Quelqu'un sait pourquoi c'est le cas?
Si vous êtes tout simplement de dessiner des images sur une toile, assurez-vous de charger les images à partir du même domaine.
http://www.example.com est différent de example.com
Donc, assurez-vous que vos images et l'url que vous avez dans votre barre d'adresse sont les mêmes, www ou pas.
Je suis en utilisant fabric.js et pourrait résoudre ce problème en utilisant toDatalessJSON au lieu de toDataURL:
Edit: Nevermind. Dans ce cas, seule l'image d'arrière-plan d'être exportées au format JPG, sans le dessin sur le dessus de sorte qu'il n'était pas forcément utile, après tout.