J'utilise jQuery et Ajax pour mes formulaires pour soumettre des données et des fichiers mais je ne sais pas comment envoyer à la fois des données et des fichiers dans un seul formulaire?
Actuellement, je fais presque la même chose avec les deux méthodes, mais la façon dont les données sont collectées dans un tableau est différente, les données utilisent .serialize();
mais les fichiers utilisent= new FormData($(this)[0]);
Est-il possible de combiner les deux méthodes pour pouvoir télécharger des fichiers et des données sous une forme via Ajax?
Données jQuery, Ajax et html
$("form#data").submit(function(){
var formData = $(this).serialize();
$.ajax({
url: window.location.pathname,
type: 'POST',
data: formData,
async: false,
success: function (data) {
alert(data)
},
cache: false,
contentType: false,
processData: false
});
return false;
});
<form id="data" method="post">
<input type="text" name="first" value="Bob" />
<input type="text" name="middle" value="James" />
<input type="text" name="last" value="Smith" />
<button>Submit</button>
</form>
Fichiers jQuery, Ajax et html
$("form#files").submit(function(){
var formData = new FormData($(this)[0]);
$.ajax({
url: window.location.pathname,
type: 'POST',
data: formData,
async: false,
success: function (data) {
alert(data)
},
cache: false,
contentType: false,
processData: false
});
return false;
});
<form id="files" method="post" enctype="multipart/form-data">
<input name="image" type="file" />
<button>Submit</button>
</form>
Comment puis-je combiner ce qui précède afin que je puisse envoyer des données et des fichiers sous une forme via Ajax?
Mon objectif est de pouvoir envoyer tout ce formulaire en un seul message avec Ajax, est-ce possible?
<form id="datafiles" method="post" enctype="multipart/form-data">
<input type="text" name="first" value="Bob" />
<input type="text" name="middle" value="James" />
<input type="text" name="last" value="Smith" />
<input name="image" type="file" />
<button>Submit</button>
</form>
FormData
approche devrait bien fonctionner avec des formulaires qui contiennent tout ce que vous voulez, pas seulement les champs de téléchargement de fichiers; il n'est cependant pas largement pris en charge.FormData
Réponses:
Le problème que j'ai eu était d'utiliser le mauvais identifiant jQuery.
Vous pouvez télécharger des données et des fichiers avec un seul formulaire en utilisant ajax .
PHP + HTML
jQuery + Ajax
Version courte
la source
$(this)[0]
est juste un alias dethis
,new FormData(this)
devrait donc être suffisant.async: false
ne semble pas nécessaire pour que cela fonctionne et provoque un blocage sur les navigateurs mobiles (à un seul thread)une autre option consiste à utiliser un iframe et à y définir la cible du formulaire.
vous pouvez essayer ceci (il utilise jQuery):
cela fonctionne bien avec tous les navigateurs, vous n'avez pas besoin de sérialiser ou de préparer les données. un inconvénient est que vous ne pouvez pas suivre les progrès.
aussi, au moins pour Chrome, la requête n'apparaîtra pas dans l'onglet "xhr" des outils de développement mais sous "doc"
la source
J'avais ce même problème dans ASP.Net MVC avec HttpPostedFilebase et au lieu d'utiliser le formulaire sur Soumettre, je devais utiliser le bouton sur le clic où je devais faire des choses et puis si tout allait bien le formulaire de soumission, voici comment je l'ai fait fonctionner
cela remplira correctement votre modèle MVC, assurez-vous que dans votre modèle, la propriété de HttpPostedFileBase [] a le même nom que le nom du contrôle d'entrée en html, c'est-à-dire
la source
contentType : "application/octet-stream"
Ou plus court:
la source
Pour moi, ça n'a pas marché sans
enctype: 'multipart/form-data'
champ dans la demande Ajax. J'espère que cela aide quelqu'un qui est coincé dans un problème similaire.Même si le
enctype
était déjà défini dans l'attribut form , pour une raison quelconque, la requête Ajax n'a pas identifié automatiquement laenctype
déclaration sans explicite (jQuery 3.3.1).Comme d'autres mentionnés ci-dessus, veuillez également porter une attention particulière aux champs
contentType
etprocessData
.la source
enctype
n'est pas mentionné du tout.enctype
champ n'est pas couvert dans la documentation pour une raison. Je n'ai pas vérifié le code source de jQuery, je ne peux donc pas le dire avec certitude.enctype
champ et il ne télécharge plus de fichiers (erreur de type de codage renvoie). Je ne sais pas comment cela fonctionne car je n'ai pas vérifié le code source de jQuery. J'ai posté cette réponse avec l'intention d'aider ceux qui sont coincés dans un problème similaire. Je ne pêche pas les votes positifs ici ... Si vous avez d'autres questions / commentaires, discutons au lieu de commenter.Pour moi, suivre le travail de code
Dans votre méthode de publication d'action, transmettez le paramètre en tant que HttpPostedFileBase UploadFile et assurez-vous que l'entrée de votre fichier est identique à celle mentionnée dans votre paramètre de la méthode d'action. Cela devrait également fonctionner avec le formulaire AJAX Begin.
Rappelez-vous ici que votre formulaire AJAX BEGIN ne fonctionnera pas ici puisque vous effectuez votre appel de poste défini dans le code mentionné ci-dessus et vous pouvez référencer votre méthode dans le code selon l'exigence
Je sais que je réponds tard mais c'est ce qui a fonctionné pour moi
la source
Une manière simple mais plus efficace:
new FormData()
est elle-même comme un conteneur (ou un sac). Vous pouvez mettre tout attr ou fichier en lui-même. La seule chose dont vous aurez besoin pour ajouterattribute, file, fileName
par exemple:et il suffit de le passer dans la demande AJAX. Par exemple:
Vous pouvez ajouter n nombre de fichiers ou de données avec FormData.
et si vous faites une demande AJAX à partir du fichier Script.js vers le fichier Route dans Node.js, méfiez-vous de l'utilisation
req.body
pour accéder aux données (par exemple, le texte)req.files
pour accéder au fichier (par exemple, l'image, la vidéo, etc.)la source
Dans mon cas, j'ai dû faire une demande POST, qui contenait des informations envoyées via l'en-tête, ainsi qu'un fichier envoyé à l'aide d'un objet FormData.
Je l'ai fait fonctionner en utilisant une combinaison de certaines des réponses ici, donc essentiellement ce qui a fini par fonctionner était d'avoir ces cinq lignes dans ma demande Ajax:
Où formData était une variable créée comme ceci:
la source
contentType: "application/octet-stream",
est activement nocif et la seule raison pour laquelle il ne pose pas de problème est que vous le remplacez deux lignes plus tard.enctype: 'multipart/form-data',
est inutile. jQuery.ajax ne reconnaît pas ce paramètre.///// otherpage.php
la source