Le site XMLHttpRequest Niveau 2 (encore à l'état de projet) définit les FormData
interface. Cette interface permet d'ajouter File
aux requêtes XHR (requêtes Ajax).
En fait, il s'agit d'une nouvelle fonctionnalité - dans le passé, l'astuce du "cadre caché" était utilisée (lire à ce sujet dans mon autre question ).
Voici comment cela fonctionne (exemple) :
var xhr = new XMLHttpRequest(),
fd = new FormData();
fd.append( 'file', input.files[0] );
xhr.open( 'POST', 'http://example.com/script.php', true );
xhr.onreadystatechange = handler;
xhr.send( fd );
donde input
es un <input type="file">
et handler
est le gestionnaire de succès pour la requête Ajax.
Cela fonctionne parfaitement dans tous les navigateurs (à nouveau, sauf IE).
Maintenant, je voudrais faire fonctionner cette fonctionnalité avec jQuery. J'ai essayé ceci :
var fd = new FormData();
fd.append( 'file', input.files[0] );
$.post( 'http://example.com/script.php', fd, handler );
Malheureusement, cela ne fonctionnera pas (une erreur "Illegal invocation" est émise). La capture d'écran est ici ). Je suppose que jQuery s'attend à un simple objet clé-valeur représentant les noms / valeurs des champs de formulaire, et que l'objet FormData
que je passe dans l'instance est apparemment incompatible.
Maintenant, puisqu'il est possible de passer un FormData
en xhr.send()
J'espère qu'il est également possible de le faire fonctionner avec jQuery.
Mise à jour :
J'ai créé un "ticket de fonctionnalité" sur le Bug Tracker de jQuery. C'est ici : http://bugs.jquery.com/ticket/9995
On m'a suggéré d'utiliser un "préfiltre Ajax"...
Mise à jour :
Tout d'abord, permettez-moi de faire une démonstration du comportement que je souhaite obtenir.
HTML :
<form>
<input type="file" id="file" name="file">
<input type="submit">
</form>
JavaScript :
$( 'form' ).submit(function ( e ) {
var data, xhr;
data = new FormData();
data.append( 'file', $( '#file' )[0].files[0] );
xhr = new XMLHttpRequest();
xhr.open( 'POST', 'http://hacheck.tel.fer.hr/xml.pl', true );
xhr.onreadystatechange = function ( response ) {};
xhr.send( data );
e.preventDefault();
});
Le code ci-dessus donne lieu à cette requête HTTP :
Voici ce dont j'ai besoin - Je veux ce type de contenu "multipart/form-data" !
La solution proposée serait la suivante :
$( 'form' ).submit(function ( e ) {
var data;
data = new FormData();
data.append( 'file', $( '#file' )[0].files[0] );
$.ajax({
url: 'http://hacheck.tel.fer.hr/xml.pl',
data: data,
processData: false,
type: 'POST',
success: function ( data ) {
alert( data );
}
});
e.preventDefault();
});
Cependant, cela a pour conséquence :
Comme vous pouvez le voir, le type de contenu est faux...
1 votes
OUI ! c'est une excellente idée ! merci aussi pour l'info. J'ai récemment trouvé un snippet qui fait cela mais ce n'est pas jQuery et je me demandais si jQuery pouvait le faire. C'est plus une réponse qu'une question pour moi. Tenez-nous au courant !
0 votes
Maintenant, si seulement je savais quoi mettre dans ce préfiltre.
1 votes
Même situation ici. Quelqu'un a-t-il d'autres indices ?
0 votes
@zaf Setting
processData:false
est un pas dans la bonne direction (voir la solution proposée par pradeek). Maintenant, si je pouvais définir manuellement l'en-tête HTTP-request "Content-Type"... Voir ma question mise à jour pour plus de détails.0 votes
Je pense que vous ne pouvez pas le faire en ajax pour supporter tous les navigateurs, je dirais que c'est bien de vérifier ce plugin ajax uploader pour voir comment ils l'ont fait. http://valums.com/ajax-upload/
6 votes
La réponse à votre question ne se trouve-t-elle pas ici ? stackoverflow.com/questions/5392344/
0 votes
@Oleg Cela pourrait être la solution à mon problème. Malheureusement, je ne peux pas la tester pour le moment
:/
0 votes
Bonjour, j'ai un problème similaire, j'essaie de faire cela, mais le téléchargement doit aller à la page facebook api. J'ai ouvert une question à ce sujet : stackoverflow.com/questions/19908342/ Toute aide est la bienvenue !
0 votes
Ajouter enctype : 'multipart/form-data' aux options de $.ajax
0 votes
Vous pouvez utiliser l'élément e-form de EHTML : github.com/Guseyn/EHTML
0 votes
Veuillez voir ceci stackoverflow.com/a/69296641/4514094