Comment puis-je télécharger des fichiers de manière asynchrone?
Je voudrais télécharger un fichier en mode asynchrone avec jQuery. C'est mon code HTML:
<span>File</span>
<input type="file" id="file" name="file" size="10"/>
<input id="uploadbutton" type="button" value="Upload"/>
Et voici mon Jquery
code:
$(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: ");
}
});
});
});
À la place du fichier en cours de téléchargement, je ne suis qu'à obtenir le nom de fichier. Que puis-je faire pour résoudre ce problème?
Solution Actuelle
Je suis en utilisant le jQuery Forme de Plugin de téléchargement de fichiers.
- Il existe différents prêts plugins sur upload de fichier pour jQuery. Faire ce genre de télécharger des hacks n'est pas une expérience agréable, de sorte que les gens aiment utiliser les solutions prêtes à l'emploi. Voici quelques-uns: - JQuery Fichier Uploader - Télécharger Plusieurs Fichiers Plugin - Mini Télécharger Plusieurs Fichiers - jQuery File Upload Vous pouvez effectuer une recherche pour des projets plus sur la NGP (à l'aide de "jquery-plugin" comme mot-clé) ou sur Github.
- vous êtes seulement le nom du fichier parce que votre var filename est d'obtenir la valeur de $('#fichier'), et le fichier qui se trouve dans l'entrée
- J'ai rencontré un peu de vraiment puissant jQuery-téléchargement de fichier de bibliothèques. Découvrez ces: 1. Plupload - docs: plupload.com/docs 2. jQuery File Upload - docs: github.com/blueimp/jQuery-File-Upload 3. FineUploader - docs: docs.fineuploader.com
- Voici une bonne: http://blueimp.github.io/jQuery-File-Upload/ - HTML5, ajax téléchargement - Gracieux de secours pour les iframes pour non pris en charge navigateurs - Multi-fichier asynchrone télécharger Nous l'avons utilisé et il fonctionne très bien. (Documentation)
- jQuery Forme de Plugin qui me semble le plus simple à utiliser et compatible avec tous les navigateurs façon... suis-je le droit ?
- Vérifiez également ceci: stackoverflow.com/questions/6974684/..., ici, il explique comment l'obtenir via jQuery
- Comment pourrait-il obtenir le obtenir le fichier qui se trouve dans l'entrée à la place?
- Si j'écris le code ci-dessus, j'obtiens: POST localhost:9000/upload 500 (Erreur Interne du Serveur)
- Reportez-vous pour ce travail entièrement réponse - stackoverflow.com/a/15327377/1362713
Vous devez vous connecter pour publier un commentaire.
Avec HTML5 vous pouvez faire des uploads de fichier avec l'Ajax et jQuery. Non seulement cela, vous pouvez faire de validation de fichier (nom, la taille et le type MIME) ou la poignée de l'événement progress avec le HTML5 progrès de la balise (ou un div). Récemment, j'ai eu à faire un fichier uploader, mais je ne voulais pas utiliser de Flash ni des Images ou des plugins et après quelques recherches j'ai trouvé la solution.
Le code HTML:
Tout d'abord, vous pouvez faire la validation de certains si vous voulez. Par exemple, dans le
.on('change')
cas du fichier:Maintenant la
$.ajax()
soumettre avec le click du bouton:Comme vous pouvez le voir, avec HTML5 (et quelques recherches) téléchargement du fichier ne sera pas seulement possible, mais super facile. Essayez avec Google Chrome que certains des composants HTML5 les exemples ne sont pas disponibles dans tous les navigateurs.
var formData = new FormData($('form')[0]);
ouserialize()
?contentType: false
?public ActionResult Upload() { var files = Request.Files ...
<input name="file" type="file" multiple="multiple"/>
ici? Je vous remercie.print_r($_POST)
POST
demandes sont jamais mise en cache, de sorte que lecache: false
option est redondant ici.<input type="file">
est ce qui est pertinent ici. le js de la gestion des événements est assurée, comme pour rendre le téléchargement de ce fichier (après que l'utilisateur interagit avec le contrôle) asynchrone. En effet, vous n'auriez pas besoin de js si vous avez soumis le formulaire, mais, encore une fois, ce n'est pas asynchrone.HtmlInputElment [type='file']
a été prolongé, pas changé (ce qui est logique, puisque nous parlons d'interfaces ici).. w3.org/TR/html5-diff/#other-extensions.. donc je suppose que cette réponse est applicable en XHTML, et pas uniquement en HTML5 (bien que, la levée de l'événement onchange est peut-être nouveau dans la mise en œuvre)name="file"
est très important sur le<input>
de tag si vous allez utiliser les données en PHP (et probablement d'autres endroits). J'ai créé un formulaire dynamiquement à l'aide de javascript donc je n'ai pas besoin de l'attribut de nom mais a appris à la dure que vous avez absolument besoin de récupérer les données côté serveur.xhr
objet est modifié, un écouteur d'événement pour l'progress
événement est ajouté à laxhr.upload
objet. Si vous voulez faire quelque chose sur les progrès, il suffit d'appliquer votre logique dans le callback passé pour que l'écouteur d'événement(progressHandlingFunction
).2019 mise à Jour: Il encore dépend des navigateurs votre démographique utilise.
Une chose importante à comprendre avec la "nouvelle" HTML5
file
API qui est n'était pas pris en charge jusqu'à ce que IE 10. Si le marché que vous visez à a un plus élevé que la moyenne prepensity vers des versions plus anciennes de Windows, vous pourriez ne pas avoir accès.À compter de 2017, environ 5% des navigateurs sont l'un des IE 6, 7, 8 ou 9. Si vous vous dirigez dans une grosse société (par exemple, c'est un outil B2B, ou quelque chose que vous livrez à des fins de formation) que le nombre peut fusée. En 2016, j'ai eu affaire avec une entreprise qui utilise IE8 sur plus de 60% de leurs machines.
C'est 2019 de cette édition, près de 11 ans après ma première réponse. IE9 et inférieur, sont à l'échelle mondiale autour de 1%, mais il y a encore des grappes de taux d'utilisation.
Le plus important à retenir de ce —quelle que soit la fonction— est, vérifier ce navigateur votre aux utilisateurs d'utiliser. Si vous ne le faites pas, vous allez apprendre une rapide et douloureuse leçon de pourquoi "travaille pour moi" n'est pas assez bon dans la prestation à un client. caniuse est un outil utile mais note où ils obtiennent leur démographie de. Ils ne peuvent pas s'aligner avec les vôtres. Ce n'est jamais plus vrai que les environnements d'entreprise.
Ma réponse à partir de 2008 de la façon suivante.
Cependant, il existe viable non-JS méthodes de téléchargement de fichiers. Vous pouvez créer un iframe sur la page (que vous cacher avec du CSS) et ensuite cibler votre formulaire de post pour que l'iframe. La page principale n'a pas besoin de se déplacer.
C'est un "vrai" post il n'est donc pas entièrement interactif. Si vous avez besoin de vous besoin de quelque chose côté serveur de processus. Cela varie massivement en fonction de votre serveur. ASP.NET a plus agréable mécanismes. PHP plain échoue, mais vous pouvez utiliser Perl ou Apache modifications de la contourner.
Si vous avez besoin de plusieurs fichiers uploads, il est préférable de faire un fichier à la fois (à surmonter maximale de téléchargement de fichiers des limites). Post la première forme de l'iframe, suivi de ses progrès à l'aide de la et quand il a fini, après la deuxième forme de l'iframe, et ainsi de suite.
Ou utiliser un Java/Flash solution. Ils sont beaucoup plus flexibles en ce qu'ils peuvent faire avec leurs messages...
Je recommande d'utiliser le Beaux-Uploader plugin pour cela. Votre
JavaScript
code serait:Note: Cette réponse est obsolète, il est maintenant possible de télécharger des fichiers à l'aide de XHR.
Vous ne pouvez pas télécharger des fichiers à l'aide de XMLHttpRequest (Ajax). Vous pouvez simuler l'effet en utilisant une iframe ou Flash. L'excellent jQuery Forme de Plugin que les messages que vos fichiers via un iframe pour obtenir l'effet.
D'emballage pour les futurs lecteurs.
Télécharger De Fichier Asynchrone
Avec HTML5
Vous pouvez télécharger des fichiers avec jQuery à l'aide de la
$.ajax()
méthode si FormData et la Fichier API sont pris en charge (à la fois de fonctionnalités de HTML5).Vous pouvez également envoyer des fichiers sans FormData mais de toute façon le Fichier API doit être présent pour traiter les fichiers de telle manière qu'ils peuvent être envoyés avec XMLHttpRequest (Ajax).
Pour un rapide, JavaScript (pas de jQuery) exemple voir "L'envoi de fichiers à l'aide d'un objet FormData".
De secours
Quand le HTML5 n'est pas pris en charge (pas de Fichier API) autres que de pur JavaScript solution (pas de Flash ou tout autre plug-in de navigateur) est le caché iframe technique, qui permet d'émuler une requête asynchrone sans l'aide de la XMLHttpRequest objet.
Il s'agit de mettre un iframe en tant que cible de la forme avec le fichier des entrées. 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 ré-rendu de la page principale. Masquage de l'iframe rend l'ensemble du processus transparent pour l'utilisateur et émule une requête asynchrone.
Si c'est fait correctement, il devrait travailler pratiquement sur n'importe quel navigateur, mais il a un certain nombre de contraintes comme la façon d'obtenir la réponse de l'iframe.
Dans ce cas, vous préférerez peut-être utiliser un wrapper plugin comme Bifröst qui utilise le iframe technique, mais fournit également un jQuery Ajax transport permettant de envoyer des fichiers avec juste la
$.ajax()
méthode comme ceci:Plugins
Bifröst c'est juste un petit emballage qui ajoute de secours de soutien à jQuery ajax méthode, mais beaucoup de ces plugins, comme jQuery Forme de Plugin ou jQuery File Upload l'ensemble de la pile de HTML5 pour les différentes réserves et quelques fonctions utiles pour faciliter le processus. En fonction de vos besoins et exigences, vous pourriez envisager un nu de la mise en œuvre ou à l'un de ces plugins.
contentType: false
. Quand je n'ai pas l'envoyer avec chrome le contenu d'un formulaire type, a été invalidé par jQuery..done()
et.fail()
rappels. Aussi, un exemple sans l'utilisation deFormData
et une liste de pro/cons serait génial.TypeError: Argument 1 of FormData.constructor does not implement interface HTMLFormElement.
Ce AJAX upload de fichier plugin jQuery télécharge le fichier quelque part, et passe le
réponse à un rappel, rien d'autre.
<input type="file">
-- Utiliser aussi peu que --
-- ou --
J'ai été en utilisant le script ci-dessous pour télécharger les images qui arrive à fonctionner correctement.
HTML
JavaScript
Explication
Je utiliser la réponse
div
pour montrer le chargement de l'animation et de la réponse après le téléchargement est terminé.Meilleure partie est que vous pouvez envoyer des données supplémentaires telles que l'id & etc avec le fichier lorsque vous utilisez ce script. Je dois mentionner
extra-data
comme dans le script.Au niveau PHP cela fonctionne comme normal de téléchargement de fichiers. extra-données peuvent être récupérées en tant que
$_POST
de données.Ici, vous n'êtes pas à l'aide d'un plugin et d'autres choses. Vous pouvez le modifier comme vous le souhaitez. Vous n'êtes pas à l'aveuglette codage ici. C'est la fonctionnalité de base de jQuery téléchargement de fichiers. Effectivement Javascript.
addEventListener
n'est pas cross-browser.Vous pouvez le faire en JavaScript natif assez facilement. Voici un extrait de mon projet actuel:
ondrop
événement que vous pouvez fairevar file = e.dataTransfer.files[0]
Vous pouvez télécharger tout simplement avec jQuery
.ajax()
.HTML:
CSS
Javascript:
Le plus simple et le plus robuste de la façon dont je l'ai fait dans le passé, c'est tout simplement une cible cachée balise iFrame avec votre formulaire, puis il soumettra à l'intérieur de l'iframe sans recharger la page.
Qui est si vous ne souhaitez pas utiliser un plugin, JavaScript, ou toute autre forme de "magie" d'autres que le HTML. Bien sûr, vous pouvez combiner cela avec le JavaScript ou qu'avez-vous...
Vous pouvez également lire le contenu de l'iframe
onLoad
pour les erreurs de serveur ou de réponses de réussite et alors que la sortie de l'utilisateur.Chrome, iframe, et onLoad
-note - vous seulement besoin de continuer à lire si vous vous intéressez à la configuration de l'INTERFACE utilisateur bloqueur lorsque vous effectuez un téléchargement
Actuellement Chrome ne déclenche pas l'événement onLoad de la balise iframe quand il est utilisé pour transférer des fichiers. Firefox, IE, et à Bord d'un incendie à l'événement onload pour les transferts de fichiers.
La seule solution que j'ai trouvé qui fonctionne pour Chrome a été d'utiliser un cookie.
Faire que, fondamentalement, une fois le chargement/téléchargement est lancé:
À l'aide d'un cookie pour ce qui est laid, mais il fonctionne.
J'ai fait un plugin jQuery pour gérer ce problème pour google Chrome lors du téléchargement, vous pouvez trouver ici
https://github.com/ArtisticPhoenix/jQuery-Plugins/blob/master/iDownloader.js
Le même principe de base qui s'applique à la mise en ligne, ainsi.
À utiliser le téléchargeur ( inclure le JS, évidemment )
Et sur le côté serveur, juste avant de transférer le fichier de données, créer le cookie
Le plugin va voir le cookie, puis déclencher le
onComplete
de rappel.Une solution que j'ai trouvé était d'avoir la
<form>
cible cachée de l'iFrame. L'iFrame peut alors exécuter JS pour afficher à l'utilisateur qu'il est complet (au chargement de la page).J'ai écrit cela dans un environnement Rails. Il n'est que d'environ cinq lignes de JavaScript, si vous utilisez le léger jQuery-forme de plugin.
Le défi consiste à obtenir de l'AJAX upload de travail comme la norme
remote_form_for
ne comprends pas partie multi-formulaire de soumission. Il ne va pas envoyer le fichier de données Rails cherche de retour avec la requête AJAX.C'est là que le jQuery-forme de plugin est en jeu.
Voici les Rails code:
Voici le JavaScript associées:
Et voici les Rails de contrôleur de l'action, la jolie vanille:
J'ai été en utilisant cette depuis quelques semaines avec Bloggity, et il a travaillé comme un champion.
Ajax Simple Uploader est une autre option:
https://github.com/LPology/Simple-Ajax-Uploader
Exemple d'utilisation:
IE7+
! L'essayer maintenant. MercijQuery Uploadify est un autre bon plugin que j'ai utilisé avant de télécharger des fichiers. Le code JavaScript est aussi simple que: le code. Toutefois, la nouvelle version ne fonctionne pas dans Internet Explorer.
J'ai fait beaucoup de recherche et j'en viens à une autre solution pour télécharger des fichiers sans aucun plugin, et seulement avec l'ajax. La solution est comme ci-dessous:
Ici est juste une autre solution de la façon de télécharger le fichier (sans plugin)
À l'aide de simples Javascripts et AJAX (avec barre de progression)
Partie HTML
JS partie
PHP partie
Voici l'EXEMPLE d'application
Vous pouvez utiliser le formulaire de données pour toutes les valeurs, y compris les images.
cache: false
est redondante sur unPOST
demandePOST
jamais caches.TypeError: Argument 1 of FormData.constructor does not implement interface HTMLFormElement.
Pour télécharger le fichier en mode asynchrone avec Jquery utiliser les étapes ci-dessous:
étape 1 Dans votre projet ouvrir Nuget gestionnaire et ajouter le package (jquery fileupload(seulement vous avez besoin de l'écrire dans la boîte de recherche, il viendra et l'installer.))
URL: https://github.com/blueimp/jQuery-File-Upload
étape 2 Ajouter ci-dessous les scripts dans les fichiers HTML, qui sont déjà ajoutés au projet en cours d'exécution au-dessus du package:
étape 3 d'Écrire le fichier de contrôle de téléchargement comme par code ci-dessous:
étape 4 écrire une méthode js comme uploadFile comme ci-dessous:
étape 5 Dans le prêt appel de fonction de l'élément de téléchargement de fichier pour lancer le processus, comme par ci-dessous:
étape 6 Écrire MVC contrôleur et l'Action comme par ci-dessous:
Convertir fichier en base64 à l'aide de |HTML5 readAsDataURL() ou certains encoder en base64.
Violon ici
Puis à récupérer:
Vous pouvez utiliser
Démo
Vous pouvez voir une solution résolu avec un travail de démonstration ici qui vous permet de prévisualiser et envoyer le formulaire de fichiers vers le serveur. Pour votre cas, vous devez utiliser Ajax pour faciliter l'upload de fichier sur le serveur:
Les données présentées est un formdata. Sur votre jQuery, utilisez un formulaire de soumission de la fonction au lieu d'un clic sur un bouton pour soumettre le formulaire de fichier comme indiqué ci-dessous.
Voir plus de détails
Exemple: Si vous utilisez jQuery, vous pouvez le faire facilement un fichier d'importation. C'est une petite et forte plugin jQuery, http://jquery.malsup.com/form/.
Exemple
, Je l'espère, il serait utile
Une approche moderne de la sans Jquery est d'utiliser le FileList objet que vous recevez de
<input type="file">
lorsque l'utilisateur sélectionne un fichier(s) et utilisez ensuite Fetch de publier la liste de Fichiers s'enrouler autour d'un FormData objet.Vous pouvez passer des paramètres supplémentaires le long avec un nom de fichier sur asynchrone à charger à l'aide de XMLHttpRequest (sans flash et iframe de la dépendance). Ajouter le paramètre supplémentaire de la valeur avec FormData et envoyer la demande de téléchargement.
Aussi, Syncfusion JavaScript UI de téléchargement de fichiers fournit la solution à ce scénario tout simplement en utilisant des arguments des événements. vous pouvez trouver de la documentation ici et plus de détails à propos de ce contrôle entrez ici description du lien ici
Recherchez de la Manipulation du processus de téléchargement d'un fichier en mode asynchrone ici:
https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications
De l'échantillon à partir du lien
C'est ma solution.
et la js
Contrôleur
À l'aide de HTML5 et JavaScript, téléchargement asynchrone est assez facile, j'ai créer le téléchargement logique avec votre code html, ce n'est pas complète, car elle a besoin de l'api, mais de démontrer comment il fonctionne, si vous avez le point de terminaison appelé
/upload
de la racine de votre site, ce code devrait fonctionner pour vous:JS:
HTML:
Également quelques informations supplémentaires à propos de XMLHttpReques:
Pour plus de détails, vous pouvez continuer la lecture ici...
Vous pouvez utiliser le code suivant.
Vous pouvez utiliser plus récent Chercher de l'API par JavaScript. Comme ceci:
Avantage: Chercher de l'API est pris en charge nativement par tous les navigateurs modernes, de sorte que vous n'avez pas à importer quoi que ce soit. Notez également que fetch() retourne un Promesse qui sont ensuite traités par l'aide de
.then(..code to handle response..)
de manière asynchrone.Vous pouvez faire de l'Asynchrone Plusieurs téléchargements de Fichiers à l'aide de JavaScript ou jQuery, et que sans l'aide de n'importe quel plugin. Vous pouvez également afficher le temps réel de l'avancement de l'upload de fichier dans le contrôle de progression. J'ai rencontré 2 jolis liens -
Le côté serveur de la langue est le C#, mais vous pouvez faire quelques modifications pour le faire fonctionner avec d'autres langages comme le PHP.
De Téléchargement de fichier ASP.NET Core, MVC:
Dans la Vue de créer le fichier de contrôle de téléchargement html:
Maintenant créer une méthode d'action dans le contrôleur:
hostingEnvironment variable est de type IHostingEnvironment qui peut être injecté au contrôleur à l'aide d'injection de dépendance, comme:
Pour PHP, recherchez https://developer.hyvor.com/php/image-upload-ajax-php-mysql
HTML
JAVASCRIPT
PHP
Vous pourriez aussi envisager d'utiliser quelque chose comme https://uppy.io.
Il n'téléchargement du fichier sans quitter la page et offre quelques bonus comme le drag & drop, de reprendre les téléchargements en cas de navigateur se bloque/réseaux douteux, et à l'importation, par exemple, d'Instagram.
Il est open source et ne pas compter sur jQuery/Réagir/Angulaire/Vue, mais peut être utilisé avec elle. Avertissement: comme son créateur, je suis partial 😉
C'est une vieille question, mais n'a toujours pas de réponse correcte réponse, donc:
Avez-vous essayé jQuery-File-Upload?
Voici un exemple à partir du lien ci-dessus qui peuvent résoudre votre problème:
Essayer
JS:
HTML:
La
content-type='multipart/form-data'
est définie par navigateur automatiquement, le nom de fichier est ajouté trop. Ici, c'est plus développé exemple avec tre de manutention et de json ajoutantJS:
HTML: