J'ai un problème lors de l'envoi d'un fichier vers un script PHP côté serveur à l'aide de la fonction ajax de jQuery. Il est possible d'obtenir la liste de fichiers avec $('#fileinput').attr('files')
mais comment est-il possible d'envoyer ces données au serveur? Le tableau résultant ( $_POST
) sur le script php côté serveur est 0 ( NULL
) lors de l'utilisation de l'entrée de fichier.
Je sais que c'est possible (même si je n'ai trouvé aucune solution jQuery jusqu'à présent, seul le code Prototye ( http://webreflection.blogspot.com/2009/03/safari-4-multiple-upload-with-progress.html ) ).
Cela semble être relativement nouveau, alors veuillez ne pas mentionner que le téléchargement de fichiers serait impossible via XHR / Ajax, car cela fonctionne certainement.
J'ai besoin des fonctionnalités de Safari 5, FF et Chrome serait bien mais ne sont pas essentielles.
Mon code pour l'instant est:
$.ajax({
url: 'php/upload.php',
data: $('#file').attr('files'),
cache: false,
contentType: 'multipart/form-data',
processData: false,
type: 'POST',
success: function(data){
alert(data);
}
});
$(':file')
pour sélectionner tous les fichiers d'entrée. C'est juste un peu plus simple.Réponses:
À partir de Safari 5 / Firefox 4, il est plus simple d'utiliser la
FormData
classe:Alors maintenant, vous avez un
FormData
objet, prêt à être envoyé avec XMLHttpRequest.Il est impératif que vous définissiez l'
contentType
option surfalse
, forçant jQuery à ne pas ajouter d'en-Content-Type
tête pour vous, sinon, la chaîne de limite sera manquante. En outre, vous devez laisser l'processData
indicateur défini sur false, sinon, jQuery essaiera de convertir votreFormData
en chaîne, ce qui échouera.Vous pouvez maintenant récupérer le fichier en PHP en utilisant:
(Il n'y a qu'un seul fichier,
file-0
sauf si vous avez spécifié l'multiple
attribut sur votre entrée de fichier, auquel cas, les nombres incrémenteront avec chaque fichier.)Utilisation de l' émulation FormData pour les anciens navigateurs
Créer 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:
Utilisez un tableau natif PHP au lieu d'un compteur
Nommez simplement vos éléments de fichier de la même manière et terminez le nom entre crochets:
$_FILES['file']
sera alors un tableau contenant les champs de téléchargement de fichier pour chaque fichier téléchargé. En fait, je recommande cela par rapport à ma solution initiale car il est plus simple de répéter.la source
data.fake
et de définir lacontentType
propriété manuellement ainsi que de remplacer xhr à utilisersendAsBinary()
.jQuery
ni laFormData
classe et vous me posez la question dans le cadre d'une question spécifique à jQuery et d'une réponse spécifique à l'utilisation de FormData? Je suis désolé mais je ne pense pas pouvoir vous y aider…application/x-www-form-urlencoded
. Y a-t-il un moyen d'utiliser à lamultipart/form-data
place?multipart/form-data
. L'utilisationapplication/x-www-form-urlencoded
ne fonctionnerait pas.Je voulais juste ajouter un peu à la grande réponse de Raphaël. Voici comment obtenir que PHP produise le même
$_FILES
, que vous utilisiez ou non JavaScript pour soumettre.Formulaire HTML:
PHP produit ceci
$_FILES
, lorsqu'il est soumis sans JavaScript:Si vous effectuez une amélioration progressive, en utilisant le JS de Raphaël pour soumettre les fichiers ...
... voici à quoi
$_FILES
ressemble le tableau de PHP , après avoir utilisé ce JavaScript pour soumettre:C'est un bon tableau, et en fait ce que certaines personnes transforment
$_FILES
, mais je trouve utile de travailler avec le même$_FILES
, peu importe si JavaScript a été utilisé pour soumettre. Voici donc quelques modifications mineures apportées au JS:(Édition du 14 avril 2017: j'ai supprimé l'élément de formulaire du constructeur de FormData () - qui a corrigé ce code dans Safari.)
Ce code fait deux choses.
input
automatiquement l'attribut name, ce qui rend le HTML plus facile à gérer. Maintenant, aussi longtemps queform
la classe putImages, tout le reste est pris en charge automatiquement. Autrement dit, leinput
besoin n'a pas de nom spécial.Avec ces modifications, la soumission avec JavaScript produit désormais exactement le même
$_FILES
tableau que la soumission avec du HTML simple.la source
Regardez mon code, il fait le travail pour moi
la source
Je viens de créer cette fonction en fonction des informations que j'ai lues.
Utilisez-le comme en utilisant
.serialize()
, au lieu de cela, mettez simplement.serializefiles();
.Travailler ici dans mes tests.
la source
var data = $("#avatar-form").serializefiles();
envoyant cela via le paramètre de données ajax et en analysant avec express formidable:form.parse(req, function(err, fields, files){
merci pour cet extrait de code :)Si votre formulaire est défini dans votre code HTML, il est plus facile de passer le formulaire dans le constructeur que d'itérer et d'ajouter des images.
la source
La réponse de Devin Venable était proche de ce que je voulais, mais je voulais une qui fonctionnerait sur plusieurs formulaires et utiliserait l'action déjà spécifiée dans le formulaire pour que chaque fichier aille au bon endroit.
Je voulais également utiliser la méthode on () de jQuery pour éviter d'utiliser .ready ().
Cela m'a amené à ceci: (remplacez formSelector par votre sélecteur jQuery)
la source
Aujourd'hui , vous ne même pas besoin jQuery :) extrayez table de support API
la source
fetch
veuillez voir la compatibilité: developer.mozilla.org/en-US/docs/Web/API/…:-|
La classe FormData fonctionne, mais dans iOS Safari (sur l'iPhone au moins), je n'ai pas pu utiliser la solution de Raphael Schweikert telle quelle.
Mozilla Dev a une belle page sur la manipulation d'objets FormData .
Alors, ajoutez un formulaire vide quelque part dans votre page, en spécifiant le enctype:
Ensuite, créez un objet FormData en tant que:
et procédez comme dans le code de Raphaël .
la source
Un problème que j'ai rencontré aujourd'hui, je pense qu'il vaut la peine de le souligner en rapport avec ce problème: si l'URL de l'appel ajax est redirigée, l'en-tête du type de contenu: 'multipart / form-data' peut être perdu.
Par exemple, je publiais sur http://server.com/context?param=x
Dans l'onglet réseau de Chrome, j'ai vu l'en-tête multipartie correct pour cette demande, mais ensuite une redirection 302 vers http://server.com/context/?param=x (notez la barre oblique après le contexte)
Pendant la redirection, l'en-tête en plusieurs parties a été perdu. Assurez-vous que les demandes ne sont pas redirigées si ces solutions ne fonctionnent pas pour vous.
la source
Toutes les solutions ci-dessus sont bonnes et élégantes, mais l'objet FormData () n'attend aucun paramètre, mais utilisez append () après l'instanciation, comme ce que l'on a écrit ci-dessus:
formData.append (nom.val, valeur.val);
la source
Si l'entrée de fichier
name
indique un tableau et des drapeauxmultiple
, et que vous analysez le toutform
avecFormData
, il n'est pas nécessaire d'itérer de manière itérativeappend()
les fichiers d'entrée.FormData
gérera automatiquement plusieurs fichiers.Notez qu'un régulier
button type="button"
est utilisé, nontype="submit"
. Cela montre qu'il n'y a aucune dépendance à utilisersubmit
pour obtenir cette fonctionnalité.L'
$_FILES
entrée résultante est comme ceci dans les outils de développement Chrome:Remarque: Il y a des cas où certaines images se téléchargent très bien lorsqu'elles sont téléchargées en tant que fichier unique, mais elles échouent lorsqu'elles sont téléchargées dans un ensemble de plusieurs fichiers. Le symptôme est que les rapports PHP sont vides
$_POST
et$_FILES
sans AJAX ne génère aucune erreur. Le problème se produit avec Chrome 75.0.3770.100 et PHP 7.0. Semble seulement se produire avec 1 sur plusieurs dizaines d'images dans mon jeu de test.la source
Les anciennes versions d'IE ne prennent pas en charge FormData (la liste complète de prise en charge du navigateur pour FormData est ici: https://developer.mozilla.org/en-US/docs/Web/API/FormData ).
Soit vous pouvez utiliser un plugin jquery (par exemple, http://malsup.com/jquery/form/#code-samples ), soit vous pouvez utiliser une solution basée sur IFrame pour publier des données de formulaire en plusieurs parties via ajax: https: // developer. mozilla.org/en-US/docs/Learn/HTML/Forms/Sending_forms_through_JavaScript
la source
PHP
jQuery et formulaire HTML
la source
la source