angularjs用file input上传图片详解
Author:zhoulujun Date:
angular 上传图片,但是filechange并angular并不鸟 ng-change事件。
这是为啥呢?
因为,ng-change,里面的$event事件,被angular重新覆盖了,看这段代码:
var ngChangeDirective = valueFn({ restrict: 'A', require: 'ngModel', link: function(scope, element, attr, ctrl) { ctrl.$viewChangeListeners.push(function() { scope.$eval(attr.ngChange); }); } });
所以,上传图片,只好在原生的基础上:
<input type="file" onchange="angular.element(this).scope().fileNameChanged(this)" accept="image/png, image/jpeg"> <img ng-src={{imgBase64}} style="max-width:300px;max-height:300px;margin:0 auto;display:block;" /> $scope.fileNameChanged = function (e) { var file=e.files[0]; var reader=new FileReader(); reader.readAsDataURL(file); reader.onload=function () { $scope.imgBase64=reader.result; $scope.$apply(); }; };
不过,不过,有造好的轮子:
Angular File Upload is a module for the AngularJS framework. Supports drag-n-drop upload, upload progress, validation filters and a file upload queue. It supports native HTML5 uploads, but degrades to a legacy iframe upload method for older browsers. Works with any server side platform which supports standard HTML form uploads.
用的时候:
<input type="file" nv-file-select uploader="uploader"/> <input type="file" nv-file-select uploader="uploader"/><br/> <ul> <li ng-repeat="item in uploader.queue"> <div> Name: <span ng-bind="item.file.name"></span></div> <div ng-show="uploader.isHTML5" ng-thumb="{ file: item._file, height: 100 }"></div> <div><button ng-click="item.upload()">upload</button></div> </li> </ul> <div> <button type="button" class="btn btn-success btn-s" ng-click="uploader.uploadAll()" ng-disabled="!uploader.getNotUploadedItems().length"> Upload all </button> <button type="button" class="btn btn-warning btn-s" ng-click="uploader.cancelAll()" ng-disabled="!uploader.isUploading" disabled="disabled"> Cancel all </button> <button type="button" class="btn btn-danger btn-s" ng-click="uploader.clearQueue()" ng-disabled="!uploader.queue.length"> Remove all </button> </div> var uploader = $scope.uploader = new FileUploader({ // url: 'http://localhost:8080/服务器', // url {String}: Path on the server to upload files // alias {String}: Name of the field which will contain the file, default is file // queue {Array}: Items to be uploaded // progress {Number}: Upload queue progress percentage. Read only. // headers {Object}: Headers to be sent along with the files. HTML5 browsers only. // formData {Array}: Data to be sent along with the files // filters {Array}: Filters to be applied to the files before adding them to the queue. If the filter returns true the file will be added to the queue // autoUpload {Boolean}: Automatically upload files after adding them to the queue // method {String}: It's a request method. By default POST. HTML5 browsers only. // removeAfterUpload {Boolean}: Remove files from the queue after uploading // isHTML5 {Boolean}: true if uploader is html5-uploader. Read only. // isUploading {Boolean}: true if an upload is in progress. Read only. // queueLimit {Number} : maximum count of files // withCredentials {Boolean} : enable CORS. HTML5 browsers only. }); //过滤器 uploader.filters.push({ name: 'yourName2', fn: function (item) { return this.queue.length < 10; } }); // CALLBACKS uploader.onWhenAddingFileFailed = function (item /*{File|FileLikeObject}*/, filter, options) { console.info('onWhenAddingFileFailed', item, filter, options); }; uploader.onAfterAddingFile = function (fileItem) { console.info('onAfterAddingFile', fileItem); }; uploader.onAfterAddingAll = function (addedFileItems) { console.info('onAfterAddingAll', addedFileItems); }; uploader.onBeforeUploadItem = function (item) { console.info('onBeforeUploadItem', item); }; uploader.onProgressItem = function (fileItem, progress) { console.info('onProgressItem', fileItem, progress); }; uploader.onProgressAll = function (progress) { console.info('onProgressAll', progress); }; uploader.onSuccessItem = function (fileItem, response, status, headers) { console.info('onSuccessItem', fileItem, response, status, headers); }; uploader.onErrorItem = function (fileItem, response, status, headers) { console.info('onErrorItem', fileItem, response, status, headers); }; uploader.onCancelItem = function (fileItem, response, status, headers) { console.info('onCancelItem', fileItem, response, status, headers); }; uploader.onCompleteItem = function (fileItem, response, status, headers) { console.info('onCompleteItem', fileItem, response, status, headers); }; uploader.onCompleteAll = function () { console.info('onCompleteAll'); };
如果,要家预览,记得,要添加,
.directive('ngThumb', ['$window', function($window) { var helper = { support: !!($window.FileReader && $window.CanvasRenderingContext2D), isFile: function(item) { return angular.isObject(item) && item instanceof $window.File; }, isImage: function(file) { var type = '|' + file.type.slice(file.type.lastIndexOf('/') + 1) + '|'; return '|jpg|png|jpeg|bmp|gif|'.indexOf(type) !== -1; } }; return { restrict: 'A', template: '<canvas/>', link: function(scope, element, attributes) { if (!helper.support) return; var params = scope.$eval(attributes.ngThumb); if (!helper.isFile(params.file)) return; if (!helper.isImage(params.file)) return; var canvas = element.find('canvas'); var reader = new FileReader(); reader.onload = onLoadFile; reader.readAsDataURL(params.file); function onLoadFile(event) { var img = new Image(); img.onload = onLoadImage; img.src = event.target.result; } function onLoadImage() { var width = params.width || this.width / this.height * params.height; var height = params.height || this.height / this.width * params.width; canvas.attr({ width: width, height: height }); canvas[0].getContext('2d').drawImage(this, 0, 0, width, height); } } }; }])
转载本站文章《angularjs用file input上传图片详解》,
请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/angularjs/2017_0717_8033.html