Je souhaite télécharger un fichier de manière asynchrone avec jQuery.
$(document).ready(function () {
$("#uploadbutton").click(function () {
var filename = $("#file").val();
$.ajax({
type: "POST",
url: "addFile.do",
enctype: 'multipart/form-data',
data: {
file: filename
},
success: function () {
alert("Data Uploaded: ");
}
});
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<span>File</span>
<input type="file" id="file" name="file" size="10"/>
<input id="uploadbutton" type="button" value="Upload"/>
Au lieu de télécharger le fichier, je ne reçois que le nom de fichier. Que puis-je faire pour résoudre ce problème?
javascript
jquery
ajax
asynchronous
xmlhttprequest
Sergio del Amo
la source
la source
Réponses:
Avec HTML5, vous pouvez effectuer des téléchargements de fichiers avec Ajax et jQuery. Non seulement cela, vous pouvez effectuer des validations de fichiers (nom, taille et type MIME) ou gérer l'événement de progression avec la balise de progression HTML5 (ou un div). Récemment, j'ai dû faire un téléchargeur de fichiers, mais je ne voulais pas utiliser Flash, ni Iframes ni plugins et après quelques recherches, j'ai trouvé la solution.
Le HTML:
Tout d'abord, vous pouvez effectuer une validation si vous le souhaitez. Par exemple, en
.on('change')
cas de fichier:Maintenant,
$.ajax()
soumettez avec le clic du bouton:Comme vous pouvez le voir, le téléchargement de fichiers HTML5 (et certaines recherches) devient non seulement possible, mais super facile. Essayez-le avec Google Chrome, car certains des composants HTML5 des exemples ne sont pas disponibles dans tous les navigateurs.
la source
name="file"
c'est très important sur la<input>
balise de fichier si vous allez utiliser les données en PHP (et probablement à d'autres endroits). J'ai créé un formulaire dynamiquement en utilisant javascript, donc je n'ai pas eu besoin de l'attribut name, mais j'ai découvert que vous en avez absolument besoin pour récupérer les données côté serveur.Mise à jour 2019: cela dépend toujours des navigateurs que votre démographie utilise.
Une chose importante à comprendre avec la "nouvelle"
file
API HTML5 est qu'elle n'était pas prise en charge avant IE 10 . Si le marché spécifique que vous visez a une propension plus élevée que la moyenne aux anciennes versions de Windows, vous pourriez ne pas y avoir accès.En 2017, environ 5% des navigateurs sont des IE 6, 7, 8 ou 9. Si vous vous dirigez vers une grande entreprise (par exemple, c'est un outil B2B ou quelque chose que vous proposez pour la formation), ce nombre peut monter en flèche . En 2016, j'ai traité avec une entreprise utilisant IE8 sur plus de 60% de leurs machines.
C'est 2019 à partir de cette édition, près de 11 ans après ma réponse initiale. IE9 et inférieurs sont globalement autour de la barre des 1%, mais il existe toujours des grappes d'utilisation plus élevée.
L'important point à retenir de cela, quelle que soit la fonctionnalité, est de vérifier quel navigateur vos utilisateurs utilisent . Si vous ne le faites pas, vous apprendrez une leçon rapide et douloureuse sur la raison pour laquelle «fonctionne pour moi» n'est pas assez bon dans un livrable à un client. caniuse est un outil utile, mais notez d'où ils tirent leurs données démographiques. Ils peuvent ne pas correspondre au vôtre. Ce n'est jamais plus vrai que les environnements d'entreprise.
Ma réponse de 2008 suit.
Cependant, il existe des méthodes viables non JS de téléchargement de fichiers. Vous pouvez créer un iframe sur la page (que vous masquez avec CSS), puis cibler votre formulaire pour le publier sur cet iframe. La page principale n'a pas besoin de bouger.
C'est un "vrai" article donc il n'est pas entièrement interactif. Si vous avez besoin d'un statut, vous avez besoin de quelque chose côté serveur pour le traiter. Cela varie considérablement en fonction de votre serveur. ASP.NET a de meilleurs mécanismes. PHP plaine échoue, mais vous pouvez utiliser des modifications Perl ou Apache pour le contourner.
Si vous avez besoin de plusieurs téléchargements de fichiers, il est préférable de faire chaque fichier un par un (pour dépasser les limites maximales de téléchargement de fichiers). Publiez le premier formulaire dans l'iframe, surveillez sa progression à l'aide de ce qui précède et, une fois terminé, publiez le deuxième formulaire dans l'iframe, etc.
Ou utilisez une solution Java / Flash. Ils sont beaucoup plus flexibles dans ce qu'ils peuvent faire avec leurs messages ...
la source
Je recommande d'utiliser le plugin Fine Uploader à cet effet. Votre
JavaScript
code serait:la source
Remarque: Cette réponse est obsolète, il est désormais possible de télécharger des fichiers à l'aide de XHR.
Vous ne pouvez pas télécharger de fichiers à l'aide de XMLHttpRequest (Ajax). Vous pouvez simuler l'effet à l'aide d'un iframe ou d'un flash. L'excellent plugin jQuery Form qui publie vos fichiers via un iframe pour obtenir l'effet.
la source
Conclusion pour les futurs lecteurs.
Téléchargement de fichier asynchrone
Avec HTML5
Vous pouvez télécharger des fichiers avec jQuery en utilisant la
$.ajax()
méthode si FormData et l' API File sont pris en charge (les deux fonctionnalités HTML5).Vous pouvez également envoyer des fichiers sans FormData mais dans tous les cas l'API File doit être présente pour traiter les fichiers de telle manière qu'ils puissent être envoyés avec XMLHttpRequest (Ajax).
Pour un exemple rapide et pur de JavaScript ( pas de jQuery ), voir " Envoi de fichiers à l'aide d'un objet FormData ".
Se retirer
Lorsque HTML5 n'est pas pris en charge (pas d' API de fichier ), la seule autre solution JavaScript pure (pas de Flash ou tout autre plugin de navigateur) est la technique iframe cachée , qui permet d'émuler une demande asynchrone sans utiliser l' objet XMLHttpRequest .
Il consiste à définir un iframe comme cible du formulaire avec les entrées de fichier. Lorsque l'utilisateur soumet une demande est faite et les fichiers sont téléchargés mais la réponse est affichée à l'intérieur de l'iframe au lieu de restituer la page principale. Masquer l'iframe rend l'ensemble du processus transparent pour l'utilisateur et émule une demande asynchrone.
Si cela est fait correctement, cela devrait fonctionner pratiquement sur n'importe quel navigateur, mais il a quelques mises en garde sur la façon d'obtenir la réponse de l'iframe.
Dans ce cas, vous préférerez peut-être utiliser un plugin wrapper comme Bifröst qui utilise la technique iframe mais fournit également un transport jQuery Ajax permettant d' envoyer des fichiers avec juste la
$.ajax()
méthode comme celle-ci:Plugins
Bifröst n'est qu'un petit wrapper qui ajoute une prise en charge de secours à la méthode ajax de jQuery, mais de nombreux plugins susmentionnés comme jQuery Form Plugin ou jQuery File Upload incluent la pile entière de HTML5 vers différentes solutions de secours et certaines fonctionnalités utiles pour faciliter le processus. Selon vos besoins et exigences, vous voudrez peut-être envisager une implémentation nue ou l'un de ces plugins.
la source
contentType: false
. Lorsque je n'ai pas envoyé cela avec Chrome, le type de contenu du formulaire a été invalidé par jQuery..done()
et les.fail()
rappels. De plus, un exemple sans l'utilisation deFormData
et une liste des avantages / inconvénients serait génial.TypeError: Argument 1 of FormData.constructor does not implement interface HTMLFormElement.
Ce plugin jQuery de téléchargement de fichier AJAX télécharge le fichier quelque part, et transmet la réponse à un rappel, rien d'autre.
<input type="file">
- Utilisez aussi peu que -
- ou autant que -
la source
J'utilise le script ci-dessous pour télécharger des images qui fonctionnent correctement.
HTML
Javascript
Explication
J'utilise la réponse
div
pour montrer l'animation de téléchargement et la réponse une fois le téléchargement terminé.La meilleure partie est que vous pouvez envoyer des données supplémentaires telles que les identifiants, etc. avec le fichier lorsque vous utilisez ce script. Je l'ai mentionné
extra-data
comme dans le script.Au niveau PHP, cela fonctionnera comme un téléchargement de fichier normal. les données supplémentaires peuvent être récupérées en tant que
$_POST
données.Ici, vous n'utilisez pas de plugin et d'autres choses. Vous pouvez modifier le code comme vous le souhaitez. Vous ne codez pas aveuglément ici. Il s'agit de la fonctionnalité principale de tout téléchargement de fichier jQuery. En fait, Javascript.
la source
addEventListener
n'est pas multi-navigateur.Vous pouvez le faire en JavaScript vanille assez facilement. Voici un extrait de mon projet actuel:
la source
ondrop
événement, vous pouvez le fairevar file = e.dataTransfer.files[0]
Vous pouvez télécharger simplement avec jQuery
.ajax()
.HTML:
CSS
Javascript:
la source
La manière la plus simple et la plus robuste que j'ai faite dans le passé, consiste simplement à cibler une balise iFrame cachée avec votre formulaire - puis elle sera soumise dans l'iframe sans recharger la page.
C'est-à-dire si vous ne voulez pas utiliser un plugin, JavaScript ou toute autre forme de "magie" autre que HTML. Bien sûr, vous pouvez combiner cela avec JavaScript ou ce que vous avez ...
Vous pouvez également lire le contenu de l'iframe
onLoad
pour les erreurs de serveur ou les réponses réussies, puis les transmettre à l'utilisateur.Chrome, iFrames et onLoad
-note- vous ne devez continuer à lire que si vous êtes intéressé par la façon de configurer un bloqueur d'interface utilisateur lors du téléchargement / téléchargement
Actuellement, Chrome ne déclenche pas l'événement onLoad pour l'iframe lorsqu'il est utilisé pour transférer des fichiers. Firefox, IE et Edge déclenchent tous l'événement onload pour les transferts de fichiers.
La seule solution que j'ai trouvée compatible avec Chrome était d'utiliser un cookie.
Pour ce faire, essentiellement lorsque le téléchargement / téléchargement est démarré:
L'utilisation d'un cookie pour cela est moche mais cela fonctionne.
J'ai créé un plugin jQuery pour gérer ce problème pour Chrome lors du téléchargement, vous pouvez le trouver ici
https://github.com/ArtisticPhoenix/jQuery-Plugins/blob/master/iDownloader.js
Le même principe de base s'applique également au téléchargement.
Pour utiliser le téléchargeur (y compris le JS, évidemment)
Et côté serveur, juste avant de transférer les données du fichier, créez le cookie
Le plugin verra le cookie, puis déclenchera le
onComplete
rappel.la source
Une solution que j'ai trouvée était d'avoir le
<form>
cible un iFrame caché. L'iFrame peut ensuite exécuter JS pour indiquer à l'utilisateur qu'il est terminé (au chargement de la page).la source
J'ai écrit ceci dans un environnement Rails . Il ne s'agit que de cinq lignes de JavaScript, si vous utilisez le plugin léger jQuery-form.
Le défi consiste à faire fonctionner le téléchargement AJAX car la norme
remote_form_for
ne comprend pas la soumission de formulaires en plusieurs parties. Il ne va pas envoyer le fichier que Rails recherche avec la demande AJAX.C'est là que le plugin jQuery-form entre en jeu.
Voici le code Rails pour cela:
Voici le JavaScript associé:
Et voici l'action du contrôleur Rails, jolie vanille:
Je l'utilise depuis quelques semaines avec Bloggity, et cela fonctionne comme un champion.
la source
Simple Ajax Uploader est une autre option:
https://github.com/LPology/Simple-Ajax-Uploader
Exemple d'utilisation:
la source
IE7+
! L'essayer maintenant. MercijQuery Uploadify est un autre bon plugin que j'ai utilisé auparavant pour télécharger des fichiers. Le code JavaScript est aussi simple que le code suivant: code. Cependant, la nouvelle version ne fonctionne pas dans Internet Explorer.
J'ai fait beaucoup de recherches et je suis arrivé à une autre solution pour télécharger des fichiers sans aucun plugin et uniquement avec ajax. La solution est la suivante:
la source
Voici juste une autre solution pour télécharger un fichier ( sans aucun plugin )
Utilisation de Javascripts simples et AJAX (avec barre de progression)
Partie HTML
Pièce JS
Partie PHP
Voici l'application EXEMPLE
la source
Vous pouvez utiliser les données du formulaire pour publier toutes vos valeurs, y compris les images.
la source
cache: false
est redondant sur unePOST
demande carPOST
ne met jamais en cache.TypeError: Argument 1 of FormData.constructor does not implement interface HTMLFormElement.
Pour télécharger un fichier de manière asynchrone avec Jquery, procédez comme suit:
étape 1 Dans votre projet, ouvrez le gestionnaire Nuget et ajoutez un package (jquery fileupload (il vous suffit de l'écrire dans la zone de recherche, il apparaîtra et l'installera.)) URL: https://github.com/blueimp/jQuery-File- Télécharger
étape 2 Ajoutez les scripts ci-dessous dans les fichiers HTML, qui sont déjà ajoutés au projet en exécutant le package ci-dessus:
étape 3 Écrivez le contrôle de téléchargement de fichier selon le code ci-dessous:
étape 4, écrivez une méthode js comme uploadFile comme ci-dessous:
Étape 5 Dans le téléchargement de fichier d'élément d'appel de fonction prêt pour lancer le processus comme ci-dessous:
étape 6 Écrivez le contrôleur MVC et l'action comme ci-dessous:
la source
Une approche moderne sans Jquery consiste à utiliser l' objet FileList que vous récupérez
<input type="file">
lorsque l'utilisateur sélectionne un ou plusieurs fichiers, puis à utiliser Fetch pour publier la FileList enroulée autour d'un objet FormData .la source
Vous pouvez voir une solution résolu avec un travail démo ici qui vous permet de visualiser et de soumettre des fichiers de formulaire au serveur. Pour votre cas, vous devez utiliser Ajax pour faciliter le téléchargement de fichiers sur le serveur:
Les données soumises sont un formulaire. Sur votre jQuery, utilisez une fonction d'envoi de formulaire au lieu d'un clic de bouton pour soumettre le fichier de formulaire comme indiqué ci-dessous.
Afficher plus de détails
la source
Exemple: si vous utilisez jQuery, vous pouvez facilement télécharger un fichier. Ceci est un plugin jQuery petit et puissant, http://jquery.malsup.com/form/ .
Exemple
J'espère que ce serait utile
la source
Vous pouvez utiliser
Démo
la source
Convertissez le fichier en base64 à l'aide de readAsDataURL () de HTML5 ou d' un encodeur base64 . Jouez ici
Puis récupérer:
la source
Vous pouvez transmettre des paramètres supplémentaires avec le nom du fichier lors de la réalisation d'un téléchargement asynchrone à l'aide de XMLHttpRequest (sans dépendance flash et iframe). Ajoutez la valeur de paramètre supplémentaire avec FormData et envoyez la demande de téléchargement.
En outre, le téléchargement de fichiers d'interface utilisateur JavaScript Syncfusion fournit une solution pour ce scénario en utilisant simplement un argument d'événement. vous pouvez trouver la documentation ici et plus de détails sur ce contrôle ici entrez la description du lien ici
la source
Recherchez Gestion du processus de téléchargement d'un fichier, de manière asynchrone ici: https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications
Échantillon du lien
la source
C'est ma solution.
et les js
Manette
la source
En utilisant HTML5 et JavaScript , le téléchargement asynchrone est assez facile, je crée la logique de téléchargement avec votre code html, cela ne fonctionne pas pleinement car il a besoin de l'API, mais démontrez comment cela fonctionne, si vous avez le point de terminaison appelé
/upload
depuis la racine de votre site Web, ce code devrait fonctionner pour vous:Également quelques informations supplémentaires sur XMLHttpReques:
Pour plus de détails, vous pouvez continuer à lire ici ...
la source
Vous pouvez utiliser l' API Fetch plus récente par JavaScript. Comme ça:
Avantage: Fetch API est nativement pris en charge par tous les navigateurs modernes, vous n'avez donc rien à importer. Notez également que fetch () renvoie une promesse qui est ensuite gérée en utilisant de
.then(..code to handle response..)
manière asynchrone.la source
Vous pouvez faire des téléchargements de fichiers multiples asynchrones en utilisant JavaScript ou jQuery et cela sans utiliser de plugin. Vous pouvez également afficher la progression en temps réel du téléchargement de fichiers dans le contrôle de progression. J'ai rencontré 2 liens sympas -
Le langage côté serveur est C # mais vous pouvez faire quelques modifications pour le faire fonctionner avec un autre langage comme PHP.
Téléchargement de fichier ASP.NET Core MVC:
Dans le contrôle View create file upload en html:
Créez maintenant une méthode d'action dans votre contrôleur:
La variable hostingEnvironment est de type IHostingEnvironment qui peut être injectée dans le contrôleur à l'aide de l'injection de dépendance, comme:
la source
Pour PHP, recherchez https://developer.hyvor.com/php/image-upload-ajax-php-mysql
HTML
JAVASCRIPT
PHP
la source
Vous pouvez également envisager d'utiliser quelque chose comme https://uppy.io .
Il télécharge les fichiers sans s'éloigner de la page et offre quelques bonus comme le glisser-déposer, la reprise des téléchargements en cas de plantage du navigateur / des réseaux instables et l'importation par exemple d'Instagram. C'est open source et ne repose pas sur jQuery / React / Angular / Vue, mais peut être utilisé avec. Avertissement: en tant que créateur, je suis partial;)
la source