回顾

  由于工作内容比较多,特别是架构方面,需要耗费很多的时间调整、重构,因此很久没有写文章了。

  话就不多说了,直接进入主题。

实现

  首先分析一下SWFUpload初始化的时候,需要传入当前触发上传的元素,正好定义directive时,link方法的第二参数就是dom元素对象,只是这个对象是angular.element,因此在不需要考虑其他的因素的情况下,我们先简单实现一个可以用的,然后再一步步加深,代码如下:

//angularjs
ahl.directive('ucUpload', [
function () {
return function (scope, el, attrs) {
new SWFUpload({
upload_url: attrs.url,
file_post_name: attrs.postName || 'file',
file_size_limit: attrs.limitSize || '2mb',
file_types: '*.png',
file_types_description: attrs.desc || '文件',
button_placeholder: el[0],
button_width: el[0].offsetWidth,
button_height: el[0].offsetHeight,
button_cursor: SWFUpload.CURSOR.HAND,
button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,
flash_url: '/swfupload.swf',
debug: false,
prevent_swf_caching: true
});
};
}
]); //html
<div url="/file/uploadForShopLogo" uc-upload></div>

  由于实现的是最简单的版本,页面上绑定的元素能够触发上传文件的窗口,如果想要进一步要求文件的类型,那么可以扩展attrs,增加相应的支持。

  但是在真实的应用环境中,如果不是通用组件,那么组件是根据业务提取的,因此所支持的类型一般是固定的,于是只需要在代码内部增加常量来代表相应的类型,而组件只需要提供类型就可以了,代码修改如下:

//angular
var TPYE = {
image: '*.jpg;*.jpeg;*.gif;*.png'
};
//其他代码
return function (scope, el, attrs) {
new SWFUpload({
//其他代码
file_types: TYPES[attrs.type]
});
}; //html
<div type="image" url="/file/uploadForShopLogo" uc-upload></div>

  接下来,开始实现上传过程当中的几个事件,基本上会用到的有如下几个:file_queued_handler、file_queue_error_handler、upload_progress_handler、upload_success_handler,事件的具体作用我就不多说了。

  只要在指令中定义几个属性与以上事件对应就行,由于file_queued_handler和file_queue_error_handler相似,只要一个事件,第一个参数用error来区分以上2个方法就可以了,代码如下:

//angular
var QUEUE_ERROR = {};
QUEUE_ERROR[SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT] = '文件超过限制大小';
QUEUE_ERROR[SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE] = '不允许上传空文件';
QUEUE_ERROR[SWFUpload.QUEUE_ERROR.INVALID_FILETYPE] = '不支持上传此格式的文件';
QUEUE_ERROR[SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED] = '超过最大可上传数量'; return {
scope: {
//文件上传过程中
progress: '&',
//文件加入队列时
queued: '&',
//文件上传成功
success: '&'
},
link: function (scope, el, attrs) {
var swf;
var opts = {
upload_url: attrs.url,
file_post_name: attrs.postName || 'file',
file_size_limit: attrs.limitSize || '2mb',
file_types: TPYES[attrs.type],
file_types_description: attrs.desc || '文件',
button_placeholder: el[0],
button_width: el[0].offsetWidth,
button_height: el[0].offsetHeight,
button_cursor: SWFUpload.CURSOR.HAND,
button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,
flash_url: '/swfupload.swf',
debug: false,
prevent_swf_caching: true
}; if (attrs.limitQueueSize)
opts.file_queue_limit = parseInt(attrs.limitQueueSize); if (attrs.queued) {
var queued = scope.queued();
opts.file_queued_handler = function (file) {
queued(null, file); swf.startUpload();
}; opts.file_queue_error_handler = function (file, errno) {
queued(QUEUE_ERROR[errno], file);
};
} if (attrs.progress) {
var progress = scope.progress();
opts.upload_progress_handler = function (file, currentSize, totalSize) {
progress({
file: file,
currentSize: currentSize,
totalSize: totalSize
});
};
} if (attrs.success) {
var success = scope.success();
opts.upload_success_handler = function (file, json) {
var res = JSON.parse(json);
res.file = file;
success(res);
}
} swf = new SWFUpload(opts);
}
}; //html
<div queued="onQueued" url="/file/uploadForShopLogo" uc-upload></div>

  组件使用的过程当中,可能不需要进度、也可能不需要其他的事件,因此编写组件的时候,可以灵活点,多增加一些判断以防某些特殊的情况。

  如果上传时,需要参数支持,只需要利用scope.$watch监听对应属性的变化,如果属性有效,则直接使用swf.setPostParams进行参数设置即可,这里就不给出相应的代码了。

结尾

  这次分享的基于SWFUpload的angular组件就到这里了,谢谢各位,如果还有其他的问题,欢迎留言。

基于SWFUpload的angular上传组件的更多相关文章

  1. vue大文件上传组件选哪个好?

    需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...

  2. Flash上传组件之SWFUpload文件上传

    一.什么是SWFUpload? SWFUpload是一个客户端文件上传工具,最初由Vinterwebb.se开发,它通过整合Flash与JavaScript技术为WEB开发者提供了一个具有丰富功能继而 ...

  3. 基于MVC4+EasyUI的Web开发框架形成之旅--附件上传组件uploadify的使用

    大概一年前,我还在用Asp.NET开发一些行业管理系统的时候,就曾经使用这个组件作为文件的上传操作,在随笔<Web开发中的文件上传组件uploadify的使用>中可以看到,Asp.NET中 ...

  4. 使用swfupload上传超过30M文件,使用FLASH上传组件

    原文:使用swfupload上传超过30M文件,使用FLASH上传组件 前一段时间会员的上传组件改用FLASH的swfupload来上传,既能很友好的显示上传进度,又能完全满足大文件的上传. 后来服务 ...

  5. 基于MVC4+EasyUI的Web开发框架形成之旅(4)--附件上传组件uploadify的使用

    大概一年前,我还在用Asp.NET开发一些行业管理系统的时候,就曾经使用这个组件作为文件的上传操作,在随笔<Web开发中的文件上传组件uploadify的使用>中可以看到,Asp.NET中 ...

  6. (转)基于MVC4+EasyUI的Web开发框架形成之旅--附件上传组件uploadify的使用

    http://www.cnblogs.com/wuhuacong/p/3343967.html 大概一年前,我还在用Asp.NET开发一些行业管理系统的时候,就曾经使用这个组件作为文件的上传操作,在随 ...

  7. 基于tornado python pandas和bootstrap上传组件的mongodb数据添加工具

    总体思路:基于bootstrap4的前端页面上传组件,把excel文件上传至服务器,并利用python pandas读取里面的数据形成字典列表 通过pymongo 接口把数据插入或追加到mongodb ...

  8. Python开发篇——基于React-Dropzone开发上传组件

    这次我要讲述的是在React-Flask框架上开发上传组件的技巧.我目前主要以React开发前端,在这个过程中认识到了许多有趣的前端UI框架--React-Bootstrap.Ant Design.M ...

  9. 基于Node的React图片上传组件实现

    写在前面 红旗不倒,誓把JavaScript进行到底!今天介绍我的开源项目 Royal 里的图片上传组件的前后端实现原理(React + Node),花了一些时间,希望对你有所帮助. 前端实现 遵循R ...

随机推荐

  1. C++ 重载操作符与转换

    <C++ Primer 4th>读书笔记 重载操作符是具有特殊名称的函数:保留字 operator 后接需定义的操作符号. Sales_item operator+(const Sales ...

  2. canvas/CSS实现仪表盘效果

    手机上看比较虚 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...

  3. Smarty3学习笔记

    Smarty3 笔记 By 飞鸿影~ -- :: Smarty入门 1.什么是smarty? Smarty是采用php写的一个模版引擎,设计的目的是要将php代码与html代码分离, 使php程序员只 ...

  4. Atitit.并发编程原理与概论 attilax总结

    Atitit.并发编程原理与概论 attilax总结 1. 并发一般涉及如下几个方面:2 2. 线程安全性 ( 2.2 原子性 2.3 加锁机制2 2.1. 线程封闭3.3.1Ad-hoc线程封闭 3 ...

  5. Eclipse连接到My sql数据库的操作总结/配置数据库驱动

    Eclipse连接到MYSQL数据库的操作 (自己亲测,开始学习Eclipse(我的Eclipse版本是4.5.2,Jdbc驱动器的jar包版本是5.1.7,亲测可以使用)连接到数据库的时候,发现网上 ...

  6. Java String字符串/==和equals区别,str。toCharAt(),getBytes,indexOf过滤存在字符,trim()/String与StringBuffer多线程安全/StringBuilder单线程—— 14.0

    课程概要 String 字符串 String字符串常用方法 StringBuffer StringBuilder String字符串: 1.实例化String对象 直接赋值  String str=& ...

  7. android: 将程序运行到手机上

    8.3.1   将程序运行到手机上 不必我多说,首先你需要拥有一部 Android 手机.现在 Android 手机早就不是什么稀罕 物,几乎已经是人手一部了,如果你还没有话,抓紧去购买吧. 想要将程 ...

  8. UVa 10387- Billiard

    UVa 10387- Billiard Table of Contents 1 题目 2 思路 3 代码 4 参考 1 题目 ============= Problem A: Billiard In ...

  9. select选择框内容左右移动添加删除栏(升级)

    先看一下之前的版本(10年前的作品了) 新版增加了拖动事件(双向及本列),双击左右自动移动,修正了算法性能更好: 也更新了如果姓名长度太长显示变形问题

  10. 使用bootstrap和metroui设计的微网站或手机app界面

    今天使用bootstrap和metroui设计了一个metro风格的移动app或者微信微网站的界面 程序的源代码可以从此处获得:https://github.com/mz121star/weixin- ...