聊一聊jQuery插件uploadify使用方法


Posted in Javascript onAugust 24, 2016

说说自己使用uploadify的一波三折的曲折过程: 

之所以要选择uploadify,是源于自己先前使用过jQuery官网的上传文件插件,比较难用(页面写的代码比较多,IE下后台回传需要配置格式【不清楚其他上传插件是否也是这样】),而且一直有IE9上传不成功的问题,到我离开上家公司的时候也一直没有解决这个问题(可能是本人比较low的原因吧)。所以在使用插件之前先调研了一下。uploadify提供两个版本,flash的uploadify和html5的uploadFive。文档还是比较齐全的,网上的使用例子页比较多,配置页比较简单,所以第一选择就是他了。

1.初体验
uploadify的flash版本免费,而且根据以往的经验所有浏览器都支持flash的(这是悲剧的开始),所以计划只使用这个版本就行。
产品给的效果如下(有三个图片预览框,每一张图片有对应的描述,所以不能用一个上传按钮,每一个上传按钮上传对应的图片) 

聊一聊jQuery插件uploadify使用方法

配置完毕后chrome自测通过(中间有个小曲折,产品那边想要多张图片一起上传,当时没有找到IE8展示的处理。后面再网上找到了一篇,然后录了下来图片上传前预览)。

要测试各个浏览器的情况,在Firefox上一看,我晕,Firefox最新的版本根本没有自带flash插件,结果就是连file input的样式都没有更改,完全没有作用。先前是想加入一段dom 

<object data="xxx.swf"  height="0" width="0"></object>

让浏览器检测到有flash文件弹出安装flash的提示。后来想一想不行啊,为了上传个文件让用户去装flash,太复杂了。

最后决定判断让支持html5的使用uploadiFive上传,不支持的才使用uploadify(flash)版本上传。
if(window.applicationCache){//支持html5        
在配置uploadify的过程中遇到两个问题:
1.file input元素是有name属性的,但是使用flash后需要手动传递过去,也就是fileObjName这个属性,配置uploadiFive也需要传递这个name。
2.fileSizeLimit设置文件大小貌似没有起到作用。最后只能自己验证(onSelect事件中验证),验证失败也需要自己处理取消上传(因为我是配置了自动上传的'auto': true)

//swf上传需要在onUploadError处理这个失败
$('#' + opts.fileObjName).uploadify('cancel');

执行取消后还需要在onUploadError事件中截取这个取消事件导致触发视为onUploadError事件

'onUploadError': function(file, errorCode, errorMsg, errorString) {
 if(errorCode != -280){//取消上传的错误码是-280
 $.dialog.error('上传失败,请重试',{txtYes: '我知道了'});
 } 
 }

下面是我的uploadify的配置 

/*
依赖于jQuery和$.dialog
opts = {
 fileObjName:'idCardPositive',
 swf: 'uploadify/uploadify.swf',
 showProgress: function(progress){},//progress:0-1
 checkFile: function(file){},
 normalOnSelect: function(){},
 normalUploaded: function(id,data),
 positionClass: 'file-btn-left',
}
*/
function init(opts){
 var maxSize = 5242880;//1024 * 1024 * 5,5M
 $('#' + opts.fileObjName).uploadify({
 'fileSizeLimit ': maxSize,
 'multi': false,//每次只能选择一个文件
 'auto': true,/*如果是自动上传,那上传按钮将没用了*/
 'fileTypeExts': '*.jpg;*.bmp;*.jpeg;*.png',
 'fileTypeDesc': '请选择图像或者视频',
 'queueID': 'fileQueue',
 'width': 200,
 'height': 140,
 'buttonText': '',
 'fileObjName': opts.fileObjName,//需要修改文件名称
 'swf': opts.swf,
 'uploader': '/pcapi/user/uploadUserChangeCardImage.htm',
 'onSelect' : function(file) {
 //有name表示是swf格式文件上传,html5文件上传参数请参考http://www.uploadify.com/documentation/uploadifive/onselect-2/
 //需要检测文件类型和大小
 if(opts.checkFile(file)){
 opts.normalOnSelect(opts.positionClass);
 }else{
 //swf上传需要在onUploadError处理这个失败
 $('#' + opts.fileObjName).uploadify('cancel');
 }
 },
 'onUploadProgress': function(file, bytesUploaded, bytesTotal, totalBytesUploaded, totalBytesTotal) {
 opts.showProgress(bytesUploaded/bytesTotal); 
 },
 'onUploadError': function(file, errorCode, errorMsg, errorString) {
 if(errorCode != -280){//取消上传的错误码是-280
 $.dialog.error('上传失败,请重试',{txtYes: '我知道了'});
 } 
 },
 'onUploadSuccess': function(file, data) {
 opts.normalUploaded(opts.fileObjName,data);
 }
 });
}

在配置uploadiFive的时候遇到一个问题:

1.fileTypeExts设置为“*.jpg;*.bmp;*.jpeg;*.png”,但实际上所有的图片格式都可以选择。所以只能在选择图片后自己手动检测格式。而且由于onSelect的参数queue没有文件类型信息:点击查看。所以只能在onAddQueueItem事件中检测,然后在onSelect中取消上传队列queue来取消文件的自动上传 

'onAddQueueItem': function(file) {//html5需要自己检测格式和大小
 fileCheckResult = opts.checkFile(file);
 },
 'onSelect' : function(queue) {
 if(fileCheckResult){
 opts.normalOnSelect(opts.positionClass);
 }else{
 $('#' + opts.fileObjName).uploadifive('clearQueue');
 }
 },

可能还有一个问题是需要配置'fileType': 'image/*',因为我直接设置了,不知道不设置会不会有问题,没试

下面是我的uploadiFive配置 

/*
依赖于jQuery和$.dialog
opts = {
 fileObjName:'idCardPositive',//name和id相同
 showProgress: function(progress){},//progress:0-1
 checkFile: function(file){},
 normalOnSelect: function(positionClass){},
 normalUploaded: function(id,data),
 positionClass: 'file-btn-left',
}
*/
function init(opts){
 var fileCheckResult = true;
 var maxSize = 5242880;//1024 * 1024 * 5,5M
 $('#' + opts.fileObjName).uploadifive({
 'fileSizeLimit ': maxSize,
 'multi': false,//每次只能选择一个文件
 'auto': true,/*如果是自动上传,那上传按钮将没用了*/
 'fileTypeExts': '*.jpg;*.bmp;*.jpeg;*.png',
 'fileTypeDesc': '请选择图像或者视频',
 'queueID': 'fileQueue',
 'width': 200,
 'height': 140,
 'buttonText': '',
 'fileObjName': opts.fileObjName,//需要修改文件名称
 'dnd': false,//不允许拖拽
 'fileType': 'image/*',
 'uploadScript': '/pcapi/user/uploadUserChangeCardImage.htm',
 'onAddQueueItem': function(file) {//html5需要自己检测格式和大小
 fileCheckResult = opts.checkFile(file);
 },
 'onSelect' : function(queue) {
 if(fileCheckResult){
 opts.normalOnSelect(opts.positionClass);
 }else{
 $('#' + opts.fileObjName).uploadifive('clearQueue');
 }
 },
 'onProgress': function(file, e) {
 opts.showProgress(e.loaded / e.total);
 },
 'onError': function(file, errorCode, errorMsg, errorString) {
 $.dialog.error('上传失败,请重试',{txtYes: '我知道了'});
 },
 'onUploadComplete': function(file, data) {
 opts.normalUploaded(opts.fileObjName,data);
 }
 });
}
 

2.当头棒喝
本地测试OK以后,放到测试环境上去测试,马上被震惊了。
遇到的第一个问题就是在IE下很多时候点击没有反应(没有弹出文件选择框),找了半天原因终于找到了:必须在文档准备完全的时候再去初始化uploadify,而且确保上传input是可用的(非display:none)
好了,可以选择文件了,但是选择文件以后IE8/9总是抛出call to startUpload failed异常,去网上查了一下,主要有几个原因

1).而是可能有多个上传的div或者input(含有相同的name或者ID)导致的,如果有两个不同的上传按钮,那么他们的name,id要设置得不一样。

这个不是什么tab的问题,而是可能有多个上传的div或者input(含有相同的name或者ID)导致的
如果有两个不同的上传按钮,那么他们的name,id要设置得不一样。 

<div id='total'> 
 <input type="file" name="total_upload" id="total_upload" multiple="true" />
</div> 
<a href="javascript:$('#total_upload').uploadify('upload', '*')">开始上传</a> 
<a href="javascript:$('#total_upload').uploadify('cancel', '*')">全部取消上传</a>

2).flash跨域导致(flash上传源码文件和页面所在的域不同【静态资源现在统一放在static.xxx.com服务器下】)。我的原因是这个,我按照网上说的使用在服务器的根目录(主域名所在工程的根目录)下防止了crossdomain.xml,但是很遗憾没有管用(可能因为我们使用的服务器不是Apache服务器吧,网上有童鞋通过这个方案解决了这个跨域问题)。最终我的解决方案是不让其跨域,我将uploadify资源放在了主域名所在工程的根目录下,然后请求这个目录下的uploadify.swf文件。好了,最终终于能够上传文件了。

最终是解决了上传的问题,花费的时间也不少,记录下来,希望后面有用uploadify的童鞋能够少走一些弯路。

Javascript 相关文章推荐
ExtJS 下拉多选框lovcombo
May 19 Javascript
asp.net+jquery滚动滚动条加载数据的下拉控件
Jun 25 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
May 12 Javascript
xml转json的js代码
Aug 28 Javascript
Bootstrap每天必学之按钮(一)
Nov 24 Javascript
javascript中不易分清的slice,splice和split三个函数
Mar 29 Javascript
js实现密码强度检测【附示例】
Mar 30 Javascript
Js自定义多选框效果的实例代码
Jul 05 Javascript
深入浅析js原型链和vue构造函数
Oct 25 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
Oct 31 Javascript
mock.js实现模拟生成假数据功能示例
Jan 15 Javascript
weui中的picker使用js进行动态绑定数据问题
Nov 06 Javascript
前端程序员必须知道的高性能Javascript知识
Aug 24 #Javascript
关于JavaScript数组你所不知道的3件事
Aug 24 #Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
Aug 24 #Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
Aug 24 #Javascript
jQuery Raty 一款不错的星级评分插件
Aug 24 #Javascript
jQuery实现自动输入email、时间和域名的方法
Aug 24 #Javascript
jQuery实现页面点击后退弹出提示框的方法
Aug 24 #Javascript
You might like
PHP VS ASP
2006/10/09 PHP
PHP CURL模拟GET及POST函数代码
2010/04/25 PHP
php ctype函数中文翻译和示例
2014/03/21 PHP
php显示时间常用方法小结
2015/06/05 PHP
Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
2011/10/12 Javascript
jQuery学习笔记之jQuery动画效果
2013/09/09 Javascript
jquery sortable的拖动方法示例详解
2014/01/16 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
2014/10/11 Javascript
JavaScript操作cookie类实例
2015/03/31 Javascript
js操作css属性实现div层展开关闭效果的方法
2015/05/11 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
2015/07/27 Javascript
基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理
2016/05/12 Javascript
bootstrap laydate日期组件使用详解
2017/01/04 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
详解ES6之用let声明变量以及let loop机制
2017/07/15 Javascript
select自定义小三角样式代码(实用总结)
2017/08/18 Javascript
分析JavaScript数组操作难点
2017/12/18 Javascript
Vue 过滤器filters及基本用法
2017/12/26 Javascript
基于vue-router 多级路由redirect 重定向的问题
2018/09/03 Javascript
JavaScript事件冒泡机制原理实例解析
2020/01/14 Javascript
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
JavaScript中条件语句的优化技巧总结
2020/12/04 Javascript
python冒泡排序算法的实现代码
2013/11/21 Python
用Python实现协同过滤的教程
2015/04/08 Python
使用Python编写爬虫的基本模块及框架使用指南
2016/01/20 Python
Python+matplotlib实现填充螺旋实例
2018/01/15 Python
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
2019/12/30 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
2020/10/12 Python
Anaconda的安装与虚拟环境建立
2020/11/18 Python
用pushplus+python监控亚马逊到货动态推送微信
2021/01/29 Python
全球地下的服装和态度:Slam Jam
2018/02/04 全球购物
工作批评与自我批评范文
2014/10/16 职场文书
现实表现材料范文
2014/12/23 职场文书
快消品行业营销模式与盈利模式分享
2019/09/27 职场文书
Nginx跨域问题解析与解决
2022/08/05 Servers