Traté de usar ng-model en la etiqueta de entrada con el archivo de tipo:
<input type="file" ng-model="vm.uploadme" />
Pero después de seleccionar un archivo, en el controlador, $ scope.vm.uploadme aún no está definido.
¿Cómo obtengo el archivo seleccionado en mi controlador?
angularjs
angularjs-ng-model
angularjs-fileupload
Endy Tjahjono
fuente
fuente
Respuestas:
Creé una solución alternativa con la directiva:
Y la etiqueta de entrada se convierte en:
O si solo se necesita la definición del archivo:
fuente
Yo uso esta directiva:
e invocarlo así:
La propiedad (editItem.editItem._attachments_uri.image) se completará con el contenido del archivo que seleccione como data-uri (!).
Tenga en cuenta que este script no cargará nada. Solo llenará su modelo con el contenido de su archivo codificado y un data-uri (base64).
Vea una demostración funcional aquí: http://plnkr.co/CMiHKv2BEidM9SShm9Vv
fuente
ngModel
la$render
función?Cómo habilitar
<input type="file">
para trabajar conng-model
Demostración de trabajo de la directiva que funciona con
ng-model
La
ng-model
directiva principal no funciona<input type="file">
fuera de la caja.Esta directiva permite a medida
ng-model
y tiene la ventaja adicional de permitir lasng-change
,ng-required
yng-form
las directivas de trabajo con<input type="file">
.fuente
Esta es una adición a la solución de @ endy-tjahjono.
Terminé no pudiendo obtener el valor de uploadme desde el alcance. Aunque uploadme en el HTML fue visiblemente actualizado por la directiva, todavía no podía acceder a su valor por $ scope.uploadme. Sin embargo, pude establecer su valor desde el alcance. Misterioso, ¿verdad ..?
Al final resultó que, la directiva creó un ámbito secundario, y el ámbito secundario tenía su propio uploadme .
La solución fue utilizar un objeto en lugar de un primitivo para mantener el valor de uploadme .
En el controlador tengo:
y en el HTML:
No hay cambios en la directiva.
Ahora, todo funciona como se esperaba. Puedo obtener el valor de uploadme.src de mi controlador usando $ scope.uploadme.
fuente
$scope.uploadme = { src: '' }
Hola chicos, creo una directiva y me registré en Bower.
Esta biblioteca lo ayudará a modelar el archivo de entrada, no solo devolver los datos del archivo, sino también el archivo dataurl o base 64.
https://github.com/mistralworks/ng-file-model/
La esperanza te ayudará
fuente
reader.readAsDataURL
método es obsoleto. El código moderno usa URL.create ObjectURL () .Esta es una versión ligeramente modificada que le permite especificar el nombre del atributo en el ámbito, tal como lo haría con ng-model, uso:
Directiva:
fuente
Para la entrada de múltiples archivos usando lodash o guión bajo:
fuente
fuente
Tenía que hacer lo mismo en múltiples entradas, así que actualicé el método @Endy Tjahjono. Devuelve una matriz que contiene todos los archivos leídos.
fuente
Tuve que modificar la directiva de Endy para poder obtener Last Modified, lastModifiedDate, nombre, tamaño, tipo y datos, así como poder obtener una matriz de archivos. Para aquellos de ustedes que necesitaban estas características adicionales, aquí están.
ACTUALIZACIÓN: Encontré un error en el que si selecciona los archivos y luego vuelve a seleccionar, pero cancela, los archivos nunca se deseleccionan como parece. Así que actualicé mi código para arreglar eso.
fuente
Si desea algo un poco más elegante / integrado, puede usar un decorador para ampliar la
input
directiva con soportetype=file
. La advertencia principal a tener en cuenta es que este método no funcionará en IE9 ya que IE9 no implementó la API de archivos . El uso de JavaScript para cargar datos binarios independientemente del tipo a través de XHR simplemente no es posible de forma nativa en IE9 o versiones anteriores (el usoActiveXObject
para acceder al sistema de archivos local no cuenta, ya que el uso de ActiveX solo requiere problemas de seguridad).Este método exacto también requiere AngularJS 1.4.xo posterior, pero es posible que pueda adaptar esto para usarlo en
$provide.decorator
lugar deangular.Module.decorator
: Escribí esta esencia para demostrar cómo hacerlo mientras se ajusta a la guía de estilo AngularJS de John Papa :¿Por qué no se hizo esto en primer lugar? El soporte de AngularJS está destinado a llegar tan atrás como IE9. Si no está de acuerdo con esta decisión y cree que deberían haberlo puesto de todos modos, salte al carro a Angular 2+ porque un mejor soporte moderno es, literalmente, por qué existe Angular 2.
fuente
Prueba esto, esto me está funcionando en JS angular
fuente