Quiero hacer una simple publicación de formulario multiparte desde AngularJS a un servidor node.js, el formulario debe contener un objeto JSON en una parte y una imagen en la otra parte (actualmente estoy publicando solo el objeto JSON con $ resource)
Pensé que debería comenzar con input type = "file", pero luego descubrí que AngularJS no puede unirse a eso ...
Todos los ejemplos que puedo encontrar son para envolver complementos jQuery para arrastrar y soltar. Quiero una carga simple de un archivo.
Soy nuevo en AngularJS y no me siento cómodo con escribir mis propias directivas.
angularjs
angularjs-fileupload
Gal Ben-Haim
fuente
fuente
Respuestas:
Una solución de trabajo real sin otras dependencias que angularjs (probado con v.1.0.6)
html
Angularjs (1.0.6) no es compatible con ng-model en las etiquetas "input-file", por lo que debe hacerlo de forma "nativa" que pase todos los archivos (eventualmente) seleccionados por el usuario.
controlador
La parte interesante es el tipo de contenido indefinido y el transformRequest: angular.identity que le da a $ http la capacidad de elegir el "tipo de contenido" correcto y administrar el límite necesario cuando se manejan datos de varias partes.
fuente
fd.append("file", files[0]); fd.append("file",files[1]); fd.append("name", "MyName")
Puede usar la directiva ng-file-upload simple / ligera . Admite arrastrar y soltar, progreso de archivos y carga de archivos para navegadores que no sean HTML5 con Flash Flash de FileAPI
JS:
fuente
Es más eficiente enviar un archivo directamente.
La codificación de base64
Content-Type: multipart/form-data
agrega una sobrecarga adicional del 33%. Si el servidor lo admite, es más eficiente enviar los archivos directamente:Al enviar una POST con un objeto File , es importante configurarlo
'Content-Type': undefined
. El método de envío XHR detectará el objeto Archivo y establecerá automáticamente el tipo de contenido.Para enviar múltiples archivos, vea Hacer múltiples
$http.post
solicitudes directamente desde una FileListEl
<input type=file>
elemento no funciona por defecto con la directiva ng-model . Necesita una directiva personalizada :Demostración de trabajo de la directiva "select-ng-files" que funciona con
ng-model
1$http.post
con tipo de contenidomultipart/form-data
Si uno debe enviar
multipart/form-data
:Al enviar un POST con la API FormData , es importante establecerlo
'Content-Type': undefined
. El método de envío XHR detectará elFormData
objeto y establecerá automáticamente el encabezado del tipo de contenido en multipart / form-data con el límite apropiado .fuente
filesInput
directiva no parece estar funcionando con Angular 1.6.7, puedo ver los archivos en elng-repeat
pero el mismo$scope.variable
está en blanco en el controlador? También uno de sus ejemplos de usofile-model
y unofiles-input
select-ng-files
. Probado con AngularJS 1.7.2.Acabo de tener este problema. Entonces hay algunos enfoques. El primero es que los nuevos navegadores admiten
Siga este enlace a un blog con información sobre cómo el soporte se limita a los navegadores modernos, pero de lo contrario resuelve totalmente este problema.
De lo contrario, puede publicar el formulario en un iframe utilizando el atributo de destino. Cuando publique el formulario, asegúrese de establecer el objetivo en un iframe con su propiedad de visualización establecida en none. El objetivo es el nombre del iframe. (Solo para que sepas.)
espero que esto ayude
fuente
Sé que es una entrada tardía, pero he creado una directiva de carga simple. ¡Lo que puedes conseguir trabajando en poco tiempo!
ng-simple-upload más en Github con un ejemplo usando API web.
fuente
Puede cargar mediante la
$resource
asignación de datos al atributo params del recurso de la siguienteactions
manera:fuente
Acabo de escribir una directiva simple (del curso existente) para un cargador simple en AngularJs.
(El complemento exacto del cargador de jQuery es https://github.com/blueimp/jQuery-File-Upload )
Un cargador simple que usa AngularJs (con implementación CORS)
(Aunque el lado del servidor es para PHP, también puede cambiarlo de nodo)
fuente