Je veux faire une simple publication de formulaire en plusieurs parties d'AngularJS vers un serveur node.js, le formulaire doit contenir un objet JSON dans une partie et une image dans l'autre partie, (je publie actuellement uniquement l'objet JSON avec $ resource)
J'ai pensé que je devrais commencer par input type = "file", mais j'ai ensuite découvert qu'AngularJS ne pouvait pas se lier à cela.
tous les exemples que je peux trouver sont pour envelopper des plugins jQuery pour le glisser-déposer. Je veux un simple téléchargement d'un fichier.
Je suis nouveau sur AngularJS et je ne me sens pas du tout à l'aise avec l'écriture de mes propres directives.
angularjs
angularjs-fileupload
Gal Ben-Haim
la source
la source
Réponses:
Une vraie solution de travail sans autres dépendances que angularjs (testé avec la v.1.0.6)
html
Angularjs (1.0.6) ne prend pas en charge ng-model sur les balises "input-file" donc vous devez le faire de manière "native" qui transmet tous les fichiers (éventuellement) sélectionnés par l'utilisateur.
manette
La partie intéressante est le type de contenu indéfini et le transformRequest: angular.identity qui donnent au $ http la possibilité de choisir le bon "type de contenu" et de gérer la limite nécessaire lors de la gestion de données en plusieurs parties.
la source
fd.append("file", files[0]); fd.append("file",files[1]); fd.append("name", "MyName")
Vous pouvez utiliser la directive simple / légère ng-file-upload . Il prend en charge le glisser-déposer, la progression du fichier et le téléchargement de fichiers pour les navigateurs non HTML5 avec le shim flash FileAPI
JS:
la source
Il est plus efficace d'envoyer un fichier directement.
L' encodage base64 de
Content-Type: multipart/form-data
ajoute une surcharge supplémentaire de 33%. Si le serveur le prend en charge, il est plus efficace d'envoyer directement les fichiers:Lors de l'envoi d'un POST avec un objet File , il est important de définir
'Content-Type': undefined
. La méthode d'envoi XHR détectera alors l' objet File et définira automatiquement le type de contenu.Pour envoyer plusieurs fichiers, consultez Faire plusieurs
$http.post
requêtes directement à partir d'une FileListL'
<input type=file>
élément ne fonctionne pas par défaut avec la directive ng-model . Il a besoin d'une directive personnalisée :Démonstration fonctionnelle de la directive "select-ng-files" qui fonctionne avec
ng-model
1$http.post
avec le type de contenumultipart/form-data
S'il faut envoyer
multipart/form-data
:Lors de l'envoi d'un POST avec l' API FormData , il est important de définir
'Content-Type': undefined
. La méthode d'envoi XHR détectera alors l'FormData
objet et définira automatiquement l'en-tête de type de contenu sur multipart / form-data avec la limite appropriée .la source
filesInput
directive ne semble pas fonctionner avec Angular 1.6.7, je peux voir les fichiers dans leng-repeat
mais le même$scope.variable
est vide dans le contrôleur? Aussi l'un de vos exemples utilisefile-model
et unfiles-input
select-ng-files
. Testé avec AngularJS 1.7.2.J'ai juste eu ce problème. Il y a donc quelques approches. Le premier est que les nouveaux navigateurs prennent en charge le
Suivez ce lien vers un blog avec des informations sur la façon dont le support est limité aux navigateurs modernes, mais sinon, cela résout totalement ce problème.
Sinon, vous pouvez publier le formulaire dans une iframe à l'aide de l'attribut cible. Lorsque vous publiez le formulaire, assurez-vous de définir la cible sur un iframe avec sa propriété d'affichage définie sur aucun. La cible est le nom de l'iframe. (Juste pour que vous le sachiez.)
J'espère que ça aide
la source
Je sais que c'est une entrée tardive mais j'ai créé une simple directive de téléchargement. Ce qui vous permet de travailler en un rien de temps!
ng-simple-upload plus sur Github avec un exemple utilisant l'API Web.
la source
Vous pouvez télécharger via
$resource
en attribuant des données à l'attribut params de la ressourceactions
comme ceci:la source
Je viens d'écrire une directive simple (à partir d'une directive existante bien sûr) pour un simple uploader dans AngularJs.
(Le plugin exact de téléchargement de jQuery est https://github.com/blueimp/jQuery-File-Upload )
Un téléchargeur simple utilisant AngularJs (avec implémentation CORS)
(Bien que le côté serveur soit pour PHP, vous pouvez simplement le changer de nœud également)
la source