change angularjs angularjs-fileupload

change - Carga de archivos usando AngularJS



ng-class (29)

HTML

<html> <head></head> <body ng-app = "myApp"> <form ng-controller = "myCtrl"> <input type = "file" file-model="files" multiple/> <button ng-click = "uploadFile()">upload me</button> <li ng-repeat="file in files">{{file.name}}</li> </form>

Guiones

<script src = "http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script> <script> angular.module(''myApp'', []).directive(''fileModel'', [''$parse'', function ($parse) { return { restrict: ''A'', link: function(scope, element, attrs) { element.bind(''change'', function(){ $parse(attrs.fileModel).assign(scope,element[0].files) scope.$apply(); }); } }; }]).controller(''myCtrl'', [''$scope'', ''$http'', function($scope, $http){ $scope.uploadFile=function(){ var fd=new FormData(); console.log($scope.files); angular.forEach($scope.files,function(file){ fd.append(''file'',file); }); $http.post(''http://localhost:1337/mediaobject/upload'',fd, { transformRequest: angular.identity, headers: {''Content-Type'': undefined} }).success(function(d) { console.log(d); }) } }]); </script>

Aquí está mi formulario HTML:

<form name="myForm" ng-submit=""> <input ng-model=''file'' type="file"/> <input type="submit" value=''Submit''/> </form>

Quiero cargar una imagen de la máquina local y quiero leer el contenido del archivo cargado. Todo esto que quiero hacer usando AngularJS.

Cuando trato de imprimir el valor de $scope.file aparece como no definido.



Algunas de las respuestas aquí proponen el uso de FormData() , pero desafortunadamente ese es un objeto del navegador que no está disponible en Internet Explorer 9 y más abajo. Si necesita ser compatible con los navegadores más antiguos, necesitará una estrategia de copia de seguridad como usar <iframe> o Flash.

Ya hay muchos módulos Angular.js para realizar la carga de archivos. Estos dos tienen soporte explícito para navegadores antiguos:

Y algunas otras opciones:

Uno de estos debe ajustarse a su proyecto, o puede darle una idea de cómo codificarlo usted mismo.


Creo que este es el archivo angular de carga:

ng-file-upload

Directiva ligera JS Angular para subir archivos.

Aquí está la página de DEMO .

  • Admite el progreso de carga, cancelar / cancelar la carga mientras está en curso, arrastrar y soltar archivos (html5), arrastrar y soltar en el directorio (webkit), CORS, PUT (html5) / métodos POST, validación del tipo y tamaño de archivo, vista previa de la imagen seleccionada / audio / videos.
  • Carga cruzada de archivos del navegador y FileReader (HTML5 y no HTML5) con Flash polyfill FileAPI. Permite la validación / modificación del lado del cliente antes de cargar el archivo
  • Carga directa a db services CouchDB, imgur, etc ... con el tipo de contenido del archivo usando Upload.http (). Esto habilita el evento de progreso para peticiones http / PUT angulares http.
  • Separe shim file, los archivos FileAPI se cargan según la demanda de código no HTML5, lo que significa que no necesita carga / código adicional si solo necesita soporte de HTML5.
  • Ligero que usa $ http regular para cargar (con shim para navegadores que no son HTML5) para que todas las funciones angulares de $ http estén disponibles

https://github.com/danialfarid/ng-file-upload


El elemento <input type=file> no funciona de manera predeterminada con la directiva ng-model . Necesita una docs.angularjs.org/guide/directive :

Demostración de trabajo de la directiva de return-files que funciona con ng-model 1

angular.module("app",[]); angular.module("app").directive("returnFiles", function() { return { require: "ngModel", link: function postLink(scope,elem,attrs,ngModel) { elem.on("change", function(e) { var files = elem[0].files; ngModel.$setViewValue(files); }) } } });

<script src="//unpkg.com/angular/angular.js"></script> <body ng-app="app"> <h1>AngularJS Input `type=file` Demo</h1> <input type="file" return-files ng-model="fileList" multiple> <h2>Files</h2> <div ng-repeat="file in fileList"> {{file.name}} </div> </body>

$http.post desde una FileList

$scope.upload = function(url, fileList) { var config = { headers: { ''Content-Type'': undefined }, transformResponse: angular.identity }; var promises = fileList.map(function(file) { return $http.post(url, file, config); }); return $q.all(promises); };

Al enviar un mensaje POST con un objeto de archivo , es importante establecer ''Content-Type'': undefined . El método de envío XHR detectará el objeto Archivo y establecerá automáticamente el tipo de contenido.


Esta es la forma 2015, sin bibliotecas de terceros. Funciona en todos los últimos navegadores.

app.directive(''myDirective'', function (httpPostFactory) { return { restrict: ''A'', scope: true, link: function (scope, element, attr) { element.bind(''change'', function () { var formData = new FormData(); formData.append(''file'', element[0].files[0]); httpPostFactory(''upload_image.php'', formData, function (callback) { // recieve image name to use in a ng-src console.log(callback); }); }); } }; }); app.factory(''httpPostFactory'', function ($http) { return function (file, data, callback) { $http({ url: file, method: "POST", data: data, headers: {''Content-Type'': undefined} }).success(function (response) { callback(response); }); }; });

HTML:

<input data-my-Directive type="file" name="file">

PHP:

if (isset($_FILES[''file'']) && $_FILES[''file''][''error''] == 0) { // uploads image in the folder images $temp = explode(".", $_FILES["file"]["name"]); $newfilename = substr(md5(time()), 0, 10) . ''.'' . end($temp); move_uploaded_file($_FILES[''file''][''tmp_name''], ''images/'' . $newfilename); // give callback to your angular code with the image src name echo json_encode($newfilename); }

js fiddle (solo front-end) https://jsfiddle.net/vince123/8d18tsey/31/


Esto debería ser una actualización / comentario a la respuesta de @jquery-guru, pero como no tengo suficiente reputación, irá aquí. Corrige los errores que ahora son generados por el código.

https://jsfiddle.net/vzhrqotw/

El cambio es básicamente:

FileUploadCtrl.$inject = [''$scope''] function FileUploadCtrl(scope) {

A:

app.controller(''FileUploadCtrl'', function($scope) {

Siéntase libre de moverse a un lugar más apropiado si lo desea.


Fácil con una directiva

HTML:

<input type="file" file-upload multiple/>

JS:

app.directive(''fileUpload'', function () { return { scope: true, //create a new scope link: function (scope, el, attrs) { el.bind(''change'', function (event) { var files = event.target.files; //iterate files since ''multiple'' may be specified on the element for (var i = 0;i<files.length;i++) { //emit event upward scope.$emit("fileSelected", { file: files[i] }); } }); } };

En la directiva, nos aseguramos de que se cree un nuevo ámbito y luego escuchamos los cambios realizados en el elemento de entrada de archivo. Cuando se detectan cambios, se emite un evento a todos los ámbitos de ancestro (hacia arriba) con el objeto de archivo como parámetro.

En su controlador:

$scope.files = []; //listen for the file selected event $scope.$on("fileSelected", function (event, args) { $scope.$apply(function () { //add the file object to the scope''s files collection $scope.files.push(args.file); }); });

Luego en tu llamada ajax:

data: { model: $scope.model, files: $scope.files }

http://shazwazza.com/post/uploading-files-and-json-data-in-the-same-request-with-angular-js/


HTML

<input type="file" id="file" name=''file'' onchange="angular.element(this).scope().profileimage(this)" />

agrega el método ''profileimage ()'' a tu controlador

$scope.profileimage = function(selectimage) { console.log(selectimage.files[0]); var selectfile=selectimage.files[0]; r = new FileReader(); r.onloadend = function (e) { debugger; var data = e.target.result; } r.readAsBinaryString(selectfile); }


He leído todo el hilo y la solución de API HTML5 se veía mejor. Pero cambia mis archivos binarios, corrompiéndolos de una manera que no he investigado. La solución que funcionó perfectamente para mí fue:

HTML:

<input type="file" id="msds" ng-model="msds" name="msds"/> <button ng-click="msds_update()"> Upload </button>

JS:

msds_update = function() { var f = document.getElementById(''msds'').files[0], r = new FileReader(); r.onloadend = function(e) { var data = e.target.result; console.log(data); var fd = new FormData(); fd.append(''file'', data); fd.append(''file_name'', f.name); $http.post(''server_handler.php'', fd, { transformRequest: angular.identity, headers: {''Content-Type'': undefined} }) .success(function(){ console.log(''success''); }) .error(function(){ console.log(''error''); }); }; r.readAsDataURL(f); }

Lado del servidor (PHP):

$file_content = $_POST[''file'']; $file_content = substr($file_content, strlen(''data:text/plain;base64,'')); $file_content = base64_decode($file_content);


Hemos utilizado HTML, CSS y AngularJS. El siguiente ejemplo muestra cómo cargar el archivo usando AngularJS.

<html> <head> <script src = "https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script> </head> <body ng-app = "myApp"> <div ng-controller = "myCtrl"> <input type = "file" file-model = "myFile"/> <button ng-click = "uploadFile()">upload me</button> </div> <script> var myApp = angular.module(''myApp'', []); myApp.directive(''fileModel'', [''$parse'', function ($parse) { return { restrict: ''A'', link: function(scope, element, attrs) { var model = $parse(attrs.fileModel); var modelSetter = model.assign; element.bind(''change'', function(){ scope.$apply(function(){ modelSetter(scope, element[0].files[0]); }); }); } }; }]); myApp.service(''fileUpload'', [''$http'', function ($http) { this.uploadFileToUrl = function(file, uploadUrl){ var fd = new FormData(); fd.append(''file'', file); $http.post(uploadUrl, fd, { transformRequest: angular.identity, headers: {''Content-Type'': undefined} }) .success(function(){ }) .error(function(){ }); } }]); myApp.controller(''myCtrl'', [''$scope'', ''fileUpload'', function($scope, fileUpload){ $scope.uploadFile = function(){ var file = $scope.myFile; console.log(''file is '' ); console.dir(file); var uploadUrl = "/fileUpload"; fileUpload.uploadFileToUrl(file, uploadUrl); }; }]); </script> </body> </html>


La respuesta anterior no es compatible con el navegador. Si alguien tiene un problema de compatibilidad, intente esto.

Fiddle

Ver código

<div ng-controller="MyCtrl"> <input type="file" id="file" name="file"/> <br> <button ng-click="add()">Add</button> <p>{{data}}</p> </div>

Código del controlador

var myApp = angular.module(''myApp'',[]); function MyCtrl($scope) { $scope.data = ''none''; $scope.add = function(){ var f = document.getElementById(''file'').files[0], r = new FileReader(); r.onloadend = function(e){ var binary = ""; var bytes = new Uint8Array(e.target.result); var length = bytes.byteLength; for (var i = 0; i < length; i++) { binary += String.fromCharCode(bytes[i]); } $scope.data = (binary).toString(); alert($scope.data); } r.readAsArrayBuffer(f); } }


Lo más fácil es usar HTML5 API, a saber FileReader

HTML es bastante sencillo:

<input type="file" id="file" name="file"/> <button ng-click="add()">Add</button>

En su controlador defina el método ''agregar'':

$scope.add = function() { var f = document.getElementById(''file'').files[0], r = new FileReader(); r.onloadend = function(e) { var data = e.target.result; //send your binary data via $http or $resource or do anything else with it } r.readAsBinaryString(f); }

Compatibilidad del navegador

Navegadores de escritorio

Firefox (Gecko) 3.6 (1.9.2), Chrome 7, Internet Explorer * 10, Opera * 12.02, Safari 6.0.2

Navegadores móviles

Firefox (Gecko) 32, Chrome 3, Internet Explorer * 10, Opera * 11.5, Safari 6.1

Nota: el método readAsBinaryString () está en desuso y, en su readAsArrayBuffer() debe utilizarse readAsArrayBuffer() .


Probé todas las alternativas que da @Anoyz (Respuesta correcta) ... y la mejor solución es https://github.com/danialfarid/ng-file-upload

Algunas caracteristicas:

  • Progreso
  • Multifiles
  • Campos
  • Navegadores antiguos (IE8-9)

Es un buen trabajo para mí. Solo hay que prestar atención a las instrucciones.

En el lado del servidor, uso NodeJs, Express 4 y Multer middleware para gestionar la solicitud de varias partes.


Puede considerar IaaS para cargar archivos, como Uploadcare . Hay un paquete Angular para él: https://github.com/uploadcare/angular-uploadcare

Técnicamente, se implementa como una directiva, que proporciona diferentes opciones para cargar y manipulaciones para las imágenes cargadas dentro del widget:

<uploadcare-widget ng-model="object.image.info.uuid" data-public-key="YOURKEYHERE" data-locale="en" data-tabs="file url" data-images-only="true" data-path-value="true" data-preview-step="true" data-clearable="true" data-multiple="false" data-crop="400:200" on-upload-complete="onUCUploadComplete(info)" on-widget-ready="onUCWidgetReady(widget)" value="{{ object.image.info.cdnUrl }}" />

Más opciones de configuración para jugar: https://uploadcare.com/widget/configure/



Puedes usar un objeto FormData que es seguro y rápido:

// Store the file object when input field is changed $scope.contentChanged = function(event){ if (!event.files.length) return null; $scope.content = new FormData(); $scope.content.append(''fileUpload'', event.files[0]); $scope.$apply(); } // Upload the file over HTTP $scope.upload = function(){ $http({ method: ''POST'', url: ''/remote/url'', headers: {''Content-Type'': undefined }, data: $scope.content, }).success(function(response) { // Uploading complete console.log(''Request finished'', response); }); }


Puedo subir archivos usando AngularJS usando el siguiente código:

El file para el argumento que se debe pasar para la función ngUploadFileUpload es $scope.file según su pregunta.

El punto clave aquí es usar transformRequest: [] . Esto evitará que $ http ensucie el contenido del archivo.

function getFileBuffer(file) { var deferred = new $q.defer(); var reader = new FileReader(); reader.onloadend = function (e) { deferred.resolve(e.target.result); } reader.onerror = function (e) { deferred.reject(e.target.error); } reader.readAsArrayBuffer(file); return deferred.promise; } function ngUploadFileUpload(endPointUrl, file) { var deferred = new $q.defer(); getFileBuffer(file).then(function (arrayBuffer) { $http({ method: ''POST'', url: endPointUrl, headers: { "accept": "application/json;odata=verbose", ''X-RequestDigest'': spContext.securityValidation, "content-length": arrayBuffer.byteLength }, data: arrayBuffer, transformRequest: [] }).then(function (data) { deferred.resolve(data); }, function (error) { deferred.reject(error); console.error("Error", error) }); }, function (error) { console.error("Error", error) }); return deferred.promise; }


Sé que esta es una entrada tardía, pero he creado una directiva de carga simple. Que puedes ponerte a trabajar en poco tiempo!

<input type="file" multiple ng-simple-upload web-api-url="/api/Upload" callback-fn="myCallback" />

ng-simple-upload más en Github con un ejemplo utilizando la API web.


SUBIR ARCHIVOS

<input type="file" name="resume" onchange="angular.element(this).scope().uploadResume()" ng-model="fileupload" id="resume" /> $scope.uploadResume = function () { var f = document.getElementById(''resume'').files[0]; $scope.selectedResumeName = f.name; $scope.selectedResumeType = f.type; r = new FileReader(); r.onloadend = function (e) { $scope.data = e.target.result; } r.readAsDataURL(f); };

DESCARGAR ARCHIVOS:

<a href="{{applicant.resume}}" download> download resume</a> var app = angular.module("myApp", []); app.config([''$compileProvider'', function ($compileProvider) { $compileProvider.aHrefSanitizationWhitelist(/^/s*(https?|local|data|chrome-extension):/); $compileProvider.imgSrcSanitizationWhitelist(/^/s*(https?|local|data|chrome-extension):/); }]);


Su archivo y sus datos json se cargan al mismo tiempo.

// FIRST SOLUTION var _post = function (file, jsonData) { $http({ url: your url, method: "POST", headers: { ''Content-Type'': undefined }, transformRequest: function (data) { var formData = new FormData(); formData.append("model", angular.toJson(data.model)); formData.append("file", data.files); return formData; }, data: { model: jsonData, files: file } }).then(function (response) { ; }); } // END OF FIRST SOLUTION // SECOND SOLUTION // İf you can add plural file and İf above code give an error. // You can try following code var _post = function (file, jsonData) { $http({ url: your url, method: "POST", headers: { ''Content-Type'': undefined }, transformRequest: function (data) { var formData = new FormData(); formData.append("model", angular.toJson(data.model)); for (var i = 0; i < data.files.length; i++) { // add each file to // the form data and iteratively name them formData.append("file" + i, data.files[i]); } return formData; }, data: { model: jsonData, files: file } }).then(function (response) { ; }); } // END OF SECOND SOLUTION


Utilice el evento onchange para pasar el elemento de archivo de entrada a su función.

<input type="file" onchange="angular.element(this).scope().fileSelected(this)" />

Entonces, cuando un usuario selecciona un archivo, tiene una referencia a él sin que el usuario tenga que hacer clic en el botón "Agregar" o "Subir".

$scope.fileSelected = function (element) { var myFileSelected = element.files[0]; };


esto funciona

archivo.html

<html> <head> <script src = "https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script> </head> <body ng-app = "app"> <div ng-controller = "myCtrl"> <input type = "file" file-model = "myFile"/> <button ng-click = "uploadFile()">upload me</button> </div> </body> <script src="controller.js"></script> </html>

controller.js

var app = angular.module(''app'', []); app.service(''fileUpload'', [''$http'', function ($http) { this.uploadFileToUrl = function(file, uploadUrl){ var fd = new FormData(); fd.append(''file'', file); $http.post(uploadUrl, fd, { transformRequest: angular.identity, headers: {''Content-Type'': undefined} }).success(function(res){ console.log(res); }).error(function(error){ console.log(error); }); } }]); app.controller(''fileCtrl'', [''$scope'', ''fileUpload'', function($scope, fileUpload){ $scope.uploadFile = function(){ var file = $scope.myFile; console.log(''file is '' ); console.dir(file); var uploadUrl = "/fileUpload.php"; // upload url stands for api endpoint to handle upload to directory fileUpload.uploadFileToUrl(file, uploadUrl); }; }]); </script>

fileupload.php

<?php $ext = pathinfo($_FILES[''file''][''name''],PATHINFO_EXTENSION); $image = time().''.''.$ext; move_uploaded_file($_FILES["file"]["tmp_name"],__DIR__. '' //'.$image); ?>


http://jsfiddle.net/vishalvasani/4hqVu/ funciona bien en Chrome e IE (si actualiza CSS un poco en la imagen de fondo). Esto se usa para actualizar la barra de progreso:

scope.progress = Math.round(evt.loaded * 100 / evt.total)

pero en FireFox los datos de [porcentaje] no se actualizan con éxito en DOM, aunque los archivos se cargan con éxito.


Ejemplo de trabajo usando una directiva simple ( ng-file-model ):

.directive("ngFileModel", [function () { return { $scope: { ngFileModel: "=" }, link: function ($scope:any, element, attributes) { element.bind("change", function (changeEvent:any) { var reader = new FileReader(); reader.onload = function (loadEvent) { $scope.$apply(function () { $scope.ngFileModel = { lastModified: changeEvent.target.files[0].lastModified, lastModifiedDate: changeEvent.target.files[0].lastModifiedDate, name: changeEvent.target.files[0].name, size: changeEvent.target.files[0].size, type: changeEvent.target.files[0].type, data: changeEvent.target.files[0] }; }); } reader.readAsDataURL(changeEvent.target.files[0]); }); } } }])

y use FormData para cargar el archivo en su función.

var formData = new FormData(); formData.append("document", $scope.ngFileModel.data) formData.append("user_id", $scope.userId)

todos los créditos van para https://github.com/mistralworks/ng-file-model

Me he enfrentado a un pequeño problema. Puede consultarlo aquí: https://github.com/mistralworks/ng-file-model

Finalmente, aquí hay un repo bifurcado: https://github.com/okasha93/ng-file-model/blob/patch-1/ng-file-model.js


El código ayudará a insertar el archivo.

<body ng-app = "myApp"> <form ng-controller="insert_Ctrl" method="post" action="" name="myForm" enctype="multipart/form-data" novalidate> <div> <p><input type="file" ng-model="myFile" class="form-control" onchange="angular.element(this).scope().uploadedFile(this)"> <span style="color:red" ng-show="(myForm.myFile.$error.required&&myForm.myFile.$touched)">Select Picture</span> </p> </div> <div> <input type="button" name="submit" ng-click="uploadFile()" class="btn-primary" ng-disabled="myForm.myFile.$invalid" value="insert"> </div> </form> <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script> <script src="insert.js"></script> </body>

insert.js

var app = angular.module(''myApp'',[]); app.service(''uploadFile'', [''$http'',''$window'', function ($http,$window) { this.uploadFiletoServer = function(file,uploadUrl){ var fd = new FormData(); fd.append(''file'', file); $http.post(uploadUrl, fd, { transformRequest: angular.identity, headers: {''Content-Type'': undefined} }) .success(function(data){ alert("insert successfull"); $window.location.href = '' '';//your window location }) .error(function(){ alert("Error"); }); } }]); app.controller(''insert_Ctrl'', [''$scope'', ''uploadFile'', function($scope, uploadFile){ $scope.uploadFile = function() { $scope.myFile = $scope.files[0]; var file = $scope.myFile; var url = "save_data.php"; uploadFile.uploadFiletoServer(file,url); }; $scope.uploadedFile = function(element) { var reader = new FileReader(); reader.onload = function(event) { $scope.$apply(function($scope) { $scope.files = element.files; $scope.src = event.target.result }); } reader.readAsDataURL(element.files[0]); } }]);

save_data.php

<?php require "dbconnection.php"; $ext = pathinfo($_FILES[''file''][''name''],PATHINFO_EXTENSION); $image = time().''.''.$ext; move_uploaded_file($_FILES["file"]["tmp_name"],"upload/".$image); $query="insert into test_table values (''null'',''$image'')"; mysqli_query($con,$query); ?>


en palabras simples

en Html - añade solo el código de abajo

<form name="upload" class="form" data-ng-submit="addFile()"> <input type="file" name="file" multiple onchange="angular.element(this).scope().uploadedFile(this)" /> <button type="submit">Upload </button> </form>

en el controlador : esta función se llama al hacer clic en el botón "cargar archivo" . subirá el archivo. Puedes consolarlo.

$scope.uploadedFile = function(element) { $scope.$apply(function($scope) { $scope.files = element.files; }); }

agregue más en los controladores - debajo del código agregue en la función Se llama a esta función cuando se hace clic en el botón que se usa "golpear la api (POST)" . enviará el archivo (que se ha cargado) y los datos de formulario al backend.

var url = httpURL + "/reporttojson" var files=$scope.files; for ( var i = 0; i < files.length; i++) { var fd = new FormData(); angular.forEach(files,function(file){ fd.append(''file'',file); }); var data ={ msg : message, sub : sub, sendMail: sendMail, selectUsersAcknowledge:false }; fd.append("data", JSON.stringify(data)); $http.post(url, fd, { withCredentials : false, headers : { ''Content-Type'' : undefined }, transformRequest : angular.identity }).success(function(data) { toastr.success("Notification sent successfully","",{timeOut: 2000}); $scope.removereport() $timeout(function() { location.reload(); }, 1000); }).error(function(data) { toastr.success("Error in Sending Notification","",{timeOut: 2000}); $scope.removereport() }); }

en este caso .. agregué el código debajo de los datos

var data ={ msg : message, sub : sub, sendMail: sendMail, selectUsersAcknowledge:false };


<form id="csv_file_form" ng-submit="submit_import_csv()" method="POST" enctype="multipart/form-data"> <input ng-model=''file'' type="file"/> <input type="submit" value=''Submit''/> </form>

En controlador angularJS

$scope.submit_import_csv = function(){ var formData = new FormData(document.getElementById("csv_file_form")); console.log(formData); $.ajax({ url: "import", type: ''POST'', data: formData, mimeType:"multipart/form-data", contentType: false, cache: false, processData:false, success: function(result, textStatus, jqXHR) { console.log(result); } }); return false; }


app.directive(''ngUpload'', function () { return { restrict: ''A'', link: function (scope, element, attrs) { var options = {}; options.enableControls = attrs[''uploadOptionsEnableControls'']; // get scope function to execute on successful form upload if (attrs[''ngUpload'']) { element.attr("target", "upload_iframe"); element.attr("method", "post"); // Append a timestamp field to the url to prevent browser caching results element.attr("action", element.attr("action") + "?_t=" + new Date().getTime()); element.attr("enctype", "multipart/form-data"); element.attr("encoding", "multipart/form-data"); // Retrieve the callback function var fn = attrs[''ngUpload''].split(''('')[0]; var callbackFn = scope.$eval(fn); if (callbackFn == null || callbackFn == undefined || !angular.isFunction(callbackFn)) { var message = "The expression on the ngUpload directive does not point to a valid function."; // console.error(message); throw message + "/n"; } // Helper function to create new i frame for each form submission var addNewDisposableIframe = function (submitControl) { // create a new iframe var iframe = $("<iframe id=''upload_iframe'' name=''upload_iframe'' border=''0'' width=''0'' height=''0'' style=''width: 0px; height: 0px; border: none; display: none'' />"); // attach function to load event of the iframe iframe.bind(''load'', function () { // get content - requires jQuery var content = iframe.contents().find(''body'').text(); // execute the upload response function in the active scope scope.$apply(function () { callbackFn(content, content !== "" /* upload completed */); }); // remove iframe if (content != "") // Fixes a bug in Google Chrome that dispose the iframe before content is ready. setTimeout(function () { iframe.remove(); }, 250); submitControl.attr(''disabled'', null); submitControl.attr(''title'', ''Click to start upload.''); }); // add the new iframe to application element.parent().append(iframe); }; // 1) get the upload submit control(s) on the form (submitters must be decorated with the ''ng-upload-submit'' class) // 2) attach a handler to the controls'' click event $(''.upload-submit'', element).click( function () { addNewDisposableIframe($(this) /* pass the submit control */); scope.$apply(function () { callbackFn("Please wait...", false /* upload not completed */); }); var enabled = true; if (options.enableControls === null || options.enableControls === undefined || options.enableControls.length >= 0) { // disable the submit control on click $(this).attr(''disabled'', ''disabled''); enabled = false; } $(this).attr(''title'', (enabled ? ''[ENABLED]: '' : ''[DISABLED]: '') + ''Uploading, please wait...''); // submit the form $(element).submit(); } ).attr(''title'', ''Click to start upload.''); } else alert("No callback function found on the ngUpload directive."); } }; }); <form class="form form-inline" name="uploadForm" id="uploadForm" ng-upload="uploadForm12" action="rest/uploadHelpFile" method="post" enctype="multipart/form-data" style="margin-top: 3px;margin-left: 6px"> <button type="submit" id="mbUploadBtn" class="upload-submit" ng-hide="true"></button> </form> @RequestMapping(value = "/uploadHelpFile", method = RequestMethod.POST) public @ResponseBody String uploadHelpFile(@RequestParam(value = "file") CommonsMultipartFile[] file,@RequestParam(value = "fileName") String fileName,@RequestParam(value = "helpFileType") String helpFileType,@RequestParam(value = "helpFileName") String helpFileName) { }