À partir de Safari 5/Firefox 4, le plus simple est d'utiliser la fonction FormData
classe :
var data = new FormData();
jQuery.each(jQuery('#file')[0].files, function(i, file) {
data.append('file-'+i, file);
});
Donc maintenant vous avez un FormData
prêt à être envoyé avec le XMLHttpRequest.
jQuery.ajax({
url: 'php/upload.php',
data: data,
cache: false,
contentType: false,
processData: false,
method: 'POST',
type: 'POST', // For jQuery < 1.9
success: function(data){
alert(data);
}
});
Il est impératif que vous définissiez le contentType
option pour false
ce qui permet à jQuery de ne pas ajouter d'élément Content-Type
pour vous, sinon, la chaîne de délimitation sera manquante. De même, vous devez laisser le champ processData
défini à false, sinon, jQuery essaiera de convertir votre code d'accès en un code d'accès à l'information. FormData
en une chaîne de caractères, ce qui échouera.
Vous pouvez maintenant récupérer le fichier en PHP en utilisant :
$_FILES['file-0']
(Il n'y a qu'un seul fichier, file-0
sauf si vous avez spécifié l'option multiple
sur votre entrée de fichier, auquel cas, les nombres s'incrémenteront avec chaque fichier).
Utilisation de la Émulation de FormData pour les navigateurs plus anciens
var opts = {
url: 'php/upload.php',
data: data,
cache: false,
contentType: false,
processData: false,
method: 'POST',
type: 'POST', // For jQuery < 1.9
success: function(data){
alert(data);
}
};
if(data.fake) {
// Make sure no text encoding stuff is done by xhr
opts.xhr = function() { var xhr = jQuery.ajaxSettings.xhr(); xhr.send = xhr.sendAsBinary; return xhr; }
opts.contentType = "multipart/form-data; boundary="+data.boundary;
opts.data = data.toString();
}
jQuery.ajax(opts);
Créer des FormData à partir d'un formulaire existant
Au lieu d'itérer manuellement les fichiers, l'objet FormData peut également être créé avec le contenu d'un objet de formulaire existant :
var data = new FormData(jQuery('form')[0]);
Utiliser un tableau natif PHP au lieu d'un compteur
Il suffit de donner le même nom à vos éléments de fichier et de terminer le nom entre parenthèses :
jQuery.each(jQuery('#file')[0].files, function(i, file) {
data.append('file[]', file);
});
$_FILES['file']
sera alors un tableau contenant les champs de téléchargement de chaque fichier téléchargé. Je recommande cette solution plutôt que ma solution initiale car elle est plus simple à itérer.
1 votes
Malheureusement, l'utilisation de l'objet FormData ne fonctionne pas sur IE<10.
0 votes
@GarciaWebDev supposément vous pouvez utiliser un polyfill avec Flash pour supporter la même API. Voir aussi github.com/Modernizr/Modernizr/wiki/ pour plus d'informations.
0 votes
Possible duplicate .
3 votes
Vous pouvez utiliser
$(':file')
pour sélectionner tous les fichiers d'entrée. C'est un peu plus simple.0 votes
@RameshwarVyevhare Cette réponse a été publiée cinq ans après la réponse à cette question. Veuillez ne pas troller des questions similaires dans le seul but de promouvoir vos propres réponses.
0 votes
@RameshwarVyevhare Votre réponse sur le lien est postée un an après que la question originale ait été posée également.