AngularJS图片上传功能的实现

原文  http://www.cnblogs.com/changjianqiu/p/4678153.html

一、前言

前一段时间做项目时,遇到一个问题就是AngularJS实现图片预览和上传的功能,当时查阅文档(都是英文文档)折腾了很久才弄出来,现将整个流程整理出来,有需要的朋友可以参考一下,如果您有更好的方法,欢迎留言交流~~话不多说直接看实现。

二、具体实现

1、html标签结构

<input type="file" file-model="myFile"/>
<div class="col-md-12">
    <img ng-src="{{imageSrc}}" style="max-width:300px;max-height:300px;margin:0 auto;display:block;" />
</div>

input文件上传标签,div包裹的img标签为图片预览区域

2、定义directive

angular.module(‘app‘)
.directive(‘fileModel‘, [‘$parse‘, function ($parse) {
  return {
    restrict: ‘A‘,
    link: function(scope, element, attrs, ngModel) {
      var model = $parse(attrs.fileModel);
      var modelSetter = model.assign;
      element.bind(‘change‘, function(event){
        scope.$apply(function(){
          modelSetter(scope, element[0].files[0]);
        });
        //附件预览
           scope.file = (event.srcElement || event.target).files[0];
        scope.getFile();
      });
    }
  };
}]);

input标签中的属性file-model即就是Angular中的指令,在上面代码的link方法中,我们为指令file-model所在的元素绑定了change事件,change方法中获取到要上传的文件对象,并调用了controller中的getFile()方法(详见controller)

3、定义控制器UploaderControler

angular.module(‘app‘)
            .controller(‘UploaderController‘, function($scope, fileReader){
                $scope.getFile = function () {
                    fileReader.readAsDataUrl($scope.file, $scope)
                                  .then(function(result) {
                                      $scope.imageSrc = result;
                                  });
                };
            })

控制器中定义了一个UploaderController,该控制器在其作用域中定义了getFile()方法,getFile方法中调用了fileReader service中的readAsDataUrl方法,此方法中生成了图片的地址url,并将结果返回getFile中,将返回的url赋值给$scope.imageSrc ,根据Angular双向数据绑定的机制,img元素中ng-src属性值为url,那么就可以在页面上预览图片了。fileReader service是如何定义的呢?

4、定义service fileReader

angular.module(‘app‘)
.factory(‘fileReader‘, ["$q", "$log", function($q, $log){
  var onLoad = function(reader, deferred, scope) {
    return function () {
      scope.$apply(function () {
        deferred.resolve(reader.result);
      });
    };
  };
  var onError = function (reader, deferred, scope) {
    return function () {
      scope.$apply(function () {
        deferred.reject(reader.result);
      });
    };
  };
  var getReader = function(deferred, scope) {
    var reader = new FileReader();
    reader.onload = onLoad(reader, deferred, scope);
    reader.onerror = onError(reader, deferred, scope);
    return reader;
  };
  var readAsDataURL = function (file, scope) {
    var deferred = $q.defer();
    var reader = getReader(deferred, scope);
    reader.readAsDataURL(file);
    return deferred.promise;
  };
  return {
    readAsDataUrl: readAsDataURL
  };
}])

fileReader service主要是完成生成获取到的文件的url地址,返回到view进行预览。

5、附件上传的实现

附件上传主要是将页面表单数据通过后台提供的接口写入到数据库中,具体实现在控制器UploaderControler中增加如下代码:

        // 组装表单数据
var postData = {
  vacationType: $scope.leave.type,
  reason: $scope.leave.reason,
  familyRelation: +$scope.leave.type == 7 ? $scope.leave.relation : "",
  startTime: startTime,
  endTime: endTime,
  fileName: $scope.imageSrc,
  workDelivers: workDelivers,
  ccmailNickNames: sendPersons,
  realDays: +$scope.leave.type == 8 ? $scope.leave.timeLong : ""
};
var promise = postMultipart(‘/maldives/leave/save‘, postData);
function postMultipart(url, data) {
  var fd = new FormData();
  angular.forEach(data, function(val, key) {
    fd.append(key, val);
  });
  var args = {
    method: ‘POST‘,
    url: url,
    data: fd,
    headers: {‘Content-Type‘: undefined},
    transformRequest: angular.identity
  };
  return $http(args);
}

postData为表单中的数据(包括上传的图片信息),‘/maldives/leave/save‘表示的是请求后台的数据接口,$http是Angular内置的service,能向后台发送GET或POST请求。

三、对Angular中service、controller、directive的认识和理解

Service就是单例对象在AngluarJS 中的一个别名。这些单例对象会被经常传来传去,保证你每次访问到的都是同一个实例。基于这种思想,单例对象让我们可以实现一些相当酷的功能,它可以让很多controller和directive访问其内部的数值。

controller把service、依赖关系、以及其它对象串联到一起,然后通过scope把它们关联到view上。如果在你的视图里面需要处理复杂的业务逻辑,那么把它们放到controller里面也是一个非常不错的选择。

Angular对directive的定义是一段代码片段,你可以用它来操作DOM,也可以使用它来进行用户交互。

时间: 2024-11-07 11:47:41

AngularJS图片上传功能的实现的相关文章

drupal中安装CKEditor文本编辑器,并配置图片上传功能 之 方法二

drupal中安装CKEditor文本编辑器,并配置图片上传功能 之 方法一 中介绍了ckeditor的安装和配置方法,其实还有另一种新方法,不用IMCE模块. 不过需要ckfinder的JS库,可以到http://ckfinder.com/download下载,下载后放到ites\all\modules\contrib\ckeditor文件夹下如图, 然后到admin/config/content/ckeditor/edit/Full配置一下 就行了

FLASH图片上传功能—从百度编辑器UEditor里面提取出来

为了记录工作中碰到的各种问题,以及学习资料整理,今天开始,将以往的文章进行了一个整理,以后也开始认真的记录学习过程中的各种问题 在HTML里面的文件上传功能一直是个问题,为了实现上传文件大小限制,怎样显示进度条问题,以及上传前图片预览,也试过各种办法,直到有一天看到百度编辑器中的图片上传功能.花了点功夫把他单独提取出来. 最终效果图如下: 这个功能可以提供多个图片文件选择,预览,然后对上传的图片在上传队列中删除,以及旋转和,上传中进度条显示,以及上传相册的选择. 源代码下载路径为: http:/

megapix-image插件 使用Canvas压缩图片上传 解决手机端图片上传功能的问题

最近在弄微信端的公众号.订阅号的相关功能,发现原本网页上用的uploadify图片上传功能到手机端有的手机类型上就不能用了,比如iphone,至于为啥我想应该不用多说了吧(uploadify使用flash实现上传的): 经过研究找到了一个手机端比较相对比较好用的插件实现图片上传,那就是megapix-image插件,比uploadify还是好用多了,下面就来上实例吧: html页面: <html> <body> <input type="file" cap

淘淘商城图片上传功能的实现

前提: 参考:集群环境下图片上传的功能分析.vmware的安装,linux的安装.nginx和ftp服务在linux的安装,ftp的客户端的使用. 图片上传是图片存储到ftp服务器上面,所以这里不需要操作mapper层. 这里用了几个工具类 ftp图片上传的工具类,图片名字的一种新的生成方式,json与java类的转换工具. 这里图片上传采用的是富文本编辑器的一个图片上传插件,在jsp页面实现的. http://kindeditor.net/docs/upload.html 根据这几个jsp页面

android之使用GridView+仿微信图片上传功能(附源代码)

由于工作要求最近在使用GridView完成图片的批量上传功能,我的例子当中包含仿微信图片上传.拍照.本地选择.相片裁剪等功能,如果有需要的朋友可以看一下,希望我的实际经验能对您有所帮助. 直接上图,下面的图片就是点击"加号"后弹出的对话框,通过对话框可以根据自己需求进行相片选择. 项目结构: 下面直接上代码. 整体的布局文件activity_main.xml 1 <LinearLayout xmlns:android="http://schemas.android.co

Jquery图片上传功能整理

最近在做一个图片上传到服务器的功能,之前基本没有什么JS的经验,用的也是网上的插件.做了一个星期才把他弄好,现在做一下总结,方便以后查看. 用的插件是WebUploader,上面有很多例子,我找的例子如下图: 在实例化WebUploader的时候需要修改upload.js文件中的server的地址,这样才能将指定的图片上传到服务器代码如下: // 实例化 uploader = WebUploader.create({ pick: { id: '#filePicker', label: '点击选择

图片上传功能&lt;转&gt;http://blog.csdn.net/u011159417/article/details/50126023

以前也实现过上传,只不过每次都是,写完之后没有总结,下次遇到时,还要重新写,重新调式,很是浪费时间,所以,今天实现一个上传图片的功能,包括简单的页面和servlet,下次再要写这个功能时,直接拿过来就可以了,没有理论,直接上代码+少量的注释.在最下面我会把项目上传,大家需要jar包,可以从项目中拿. 该项目用到的jar包如图,在下面的项目demo中有jar包: 一.upload.jsp页面代码: [html] view plain copy print? <%@ page language=&quo

easyui 图片上传功能详解

页面展示: 1.点击图片上传 跳转页面 携带2个参数  ID  NAME=所属模块 jsp 如图: js  可以上传文件和图片代码: $(function() {var falg=0;    $list = $('#thelist');    var uploader = WebUploader.create({        // 选完文件后,是否自动上传.        auto : false,        // swf文件路径        swf : 'plugins/expand/

ckeditor 图片上传功能配置

1. /ckeditor/plugins/image/dialogs/image.js 搜索 upload 把 hidden:!0 改为 hidden:0 2. config.js 新增配置项 config.image_previewText=' '; //预览区域显示内容 config.filebrowserUploadUrl="/ckeditor/upload"; //图片上传地址 3. 图片上传 接口 预览图片功能实现 $fn = isset($_GET['CKEditorFun