C'est possible! Lire ci-dessous.
Tout d'abord, permettez-moi d'utiliser ce schéma pour expliquer comment asynchrone de téléchargement de fichiers peuvent être obtenus:
Désolé. J'ai fermé un de mes domaines, et l'image est maintenant disparu. C'était vraiment une très belle image bien. C'était avant que j'ai découvert qu'un Débordement de Pile permet de télécharger des images via Imgur.
Comme vous pouvez le voir, le truc est de laisser le HTTP de la réponse de la charge dans un IFRAME masqué élément au lieu de la page elle-même. (Ceci est fait en mettant l' target
de la propriété de l'élément de FORMULAIRE lors de l'envoi du FORMULAIRE avec JavaScript.)
Les travaux de cette. Cependant, le problème que je me pose, c'est que le script côté serveur est sur un autre domaine. La FORME de la soumettre est un cross-domain HTTP-request. Maintenant, le script côté serveur de la SCRO a permis qui lui donne ma page web les droits pour lire la réponse-données de HTTP-demande faite à partir de ma page pour ce script, mais qui ne fonctionne que si je reçois le HTTP-réponse via Ajax, ergo, JavaScript.
Cependant, int ce cas, la réponse est dirigée vers l'élément IFRAME. Et une fois la réponse XML terres dans l'IFRAME, son URL sera le script de suppression - par exemple, http://remote-domain.com/script.pl
.
Malheureusement, la SCRO ne couvre pas ce cas (du moins je pense) - je ne suis pas capable de lire le contenu de l'IFRAME depuis son URL ne correspond pas à l'URL de la page (domaine différent). J'obtiens cette erreur:
Dangereux JavaScript tentative d'accès à une image avec l'URL hxxp://remote-domain.com/script.pl à partir de l'image avec l'URL hxxp://my-domain.com/outer.html. Les domaines, les protocoles et les ports doivent match.
Et puisque le contenu de l'IFRAME est un document XML, il n'y a pas de code JavaScript à l'intérieur de l'IFRAME qui pourraient utiliser postMessage
ou quelque chose.
Donc ma question est: Comment puis-je obtenir le code XML contenu de l'IFRAME?
Comme je l'ai dit plus haut, je suis en mesure de récupérer de la croix-domaine HTTP-réponses directement CORS (activé), mais il semble que je ne suis pas capable de lire de la croix-domaine HTTP-réponses une fois leur chargement, dans une IFRAME.
Et comme si cette question n'est pas insoluble assez, laissez-moi exclure ces solutions:
easyXDM et de techniques similaires qui nécessitent un point final sur le domaine distant,
modifier la réponse XML (inclure un élément de SCRIPT),
côté serveur proxy - je comprendre que je pouvais avoir un script côté serveur sur mon domaine, qui pourraient servir d'un proxy.
Si, en dehors de ces deux solutions, cela peut-il être fait?
Il peut être fait!!
Il s'avère qu'il est possible d'établir un XHR-demande (Ajax demande) qui imite un multipart/form-data
soumettre le FORMULAIRE (qui est utilisé dans l'image ci-dessus pour télécharger le fichier sur le serveur).
L'astuce est d'utiliser FormData
de constructeur de lire ce Mozilla Hacks article pour plus d'informations.
C'est comment vous le faites:
// STEP 1
// retrieve a reference to the file
// <input type="file"> elements have a "files" property
var file = input.files[0];
// STEP 2
// create a FormData instance, and append the file to it
var fd = new FormData();
fd.append('file', file);
// STEP 3
// send the FormData instance with the XHR object
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://remote-domain.com/script.pl', true);
xhr.onreadystatechange = responseHandler;
xhr.send(fd);
La méthode ci-dessus exécute un fichier asynchrone-uplaod, ce qui est équivalent à la régulière de téléchargement de fichier décrit dans l'image ci-dessus et a réalisé en soumettant ce formulaire:
<form action="http://remote-domain.com/script.pl"
enctype="multipart/form-data" method="post">
<input type="file" name="file">
</form>