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

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

1.初体验

  uploadify的flash版本免费,而且根据以往的经验所有浏览器都支持flash的(这是悲剧的开始),所以计划只使用这个版本就行。

  产品给的效果如下(有三个图片预览框,每一张图片有对应的描述,所以不能用一个上传按钮,每一个上传按钮上传对应的图片)

  

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

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

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

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

  最后决定判断让支持html5的使用uploadiFive上传,不支持的才使用uploadify(flash)版本上传。

  1. if(window.applicationCache){//支持html5

在配置uploadify的过程中遇到两个问题:

  1.file input元素是有name属性的,但是使用flash后需要手动传递过去,也就是fileObjName这个属性,配置uploadiFive也需要传递这个name。

  2.fileSizeLimit设置文件大小貌似没有起到作用。最后只能自己验证(onSelect事件中验证),验证失败也需要自己处理取消上传(因为我是配置了自动上传的'auto': true)

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

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

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

  下面是我的uploadify的配置

  1. /*
  2. 依赖于jQuery和$.dialog
  3. opts = {
  4. fileObjName:'idCardPositive',
  5. swf: 'uploadify/uploadify.swf',
  6. showProgress: function(progress){},//progress:0-1
  7. checkFile: function(file){},
  8. normalOnSelect: function(){},
  9. normalUploaded: function(id,data),
  10. positionClass: 'file-btn-left',
  11. }
  12. */
  13. function init(opts){
  14. var maxSize = 5242880;//1024 * 1024 * 5,5M
  15. $('#' + opts.fileObjName).uploadify({
  16. 'fileSizeLimit ': maxSize,
  17. 'multi': false,//每次只能选择一个文件
  18. 'auto': true,/*如果是自动上传,那上传按钮将没用了*/
  19. 'fileTypeExts': '*.jpg;*.bmp;*.jpeg;*.png',
  20. 'fileTypeDesc': '请选择图像或者视频',
  21. 'queueID': 'fileQueue',
  22. 'width': 200,
  23. 'height': 140,
  24. 'buttonText': '',
  25. 'fileObjName': opts.fileObjName,//需要修改文件名称
  26. 'swf': opts.swf,
  27. 'uploader': '/pcapi/user/uploadUserChangeCardImage.htm',
  28. 'onSelect' : function(file) {
  29. //有name表示是swf格式文件上传,html5文件上传参数请参考http://www.uploadify.com/documentation/uploadifive/onselect-2/
  30. //需要检测文件类型和大小
  31. if(opts.checkFile(file)){
  32. opts.normalOnSelect(opts.positionClass);
  33. }else{
  34. //swf上传需要在onUploadError处理这个失败
  35. $('#' + opts.fileObjName).uploadify('cancel');
  36. }
  37. },
  38. 'onUploadProgress': function(file, bytesUploaded, bytesTotal, totalBytesUploaded, totalBytesTotal) {
  39. opts.showProgress(bytesUploaded/bytesTotal);
  40. },
  41. 'onUploadError': function(file, errorCode, errorMsg, errorString) {
  42. if(errorCode != -280){//取消上传的错误码是-280
  43. $.dialog.error('上传失败,请重试',{txtYes: '我知道了'});
  44. }
  45. },
  46. 'onUploadSuccess': function(file, data) {
  47. opts.normalUploaded(opts.fileObjName,data);
  48. }
  49. });
  50. }

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

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

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

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

  下面是我的uploadiFive配置

  1. /*
  2. 依赖于jQuery和$.dialog
  3. opts = {
  4. fileObjName:'idCardPositive',//name和id相同
  5. showProgress: function(progress){},//progress:0-1
  6. checkFile: function(file){},
  7. normalOnSelect: function(positionClass){},
  8. normalUploaded: function(id,data),
  9. positionClass: 'file-btn-left',
  10. }
  11. */
  12. function init(opts){
  13. var fileCheckResult = true;
  14. var maxSize = 5242880;//1024 * 1024 * 5,5M
  15. $('#' + opts.fileObjName).uploadifive({
  16. 'fileSizeLimit ': maxSize,
  17. 'multi': false,//每次只能选择一个文件
  18. 'auto': true,/*如果是自动上传,那上传按钮将没用了*/
  19. 'fileTypeExts': '*.jpg;*.bmp;*.jpeg;*.png',
  20. 'fileTypeDesc': '请选择图像或者视频',
  21. 'queueID': 'fileQueue',
  22. 'width': 200,
  23. 'height': 140,
  24. 'buttonText': '',
  25. 'fileObjName': opts.fileObjName,//需要修改文件名称
  26. 'dnd': false,//不允许拖拽
  27. 'fileType': 'image/*',
  28. 'uploadScript': '/pcapi/user/uploadUserChangeCardImage.htm',
  29. 'onAddQueueItem': function(file) {//html5需要自己检测格式和大小
  30. fileCheckResult = opts.checkFile(file);
  31. },
  32. 'onSelect' : function(queue) {
  33. if(fileCheckResult){
  34. opts.normalOnSelect(opts.positionClass);
  35. }else{
  36. $('#' + opts.fileObjName).uploadifive('clearQueue');
  37. }
  38. },
  39. 'onProgress': function(file, e) {
  40. opts.showProgress(e.loaded / e.total);
  41. },
  42. 'onError': function(file, errorCode, errorMsg, errorString) {
  43. $.dialog.error('上传失败,请重试',{txtYes: '我知道了'});
  44. },
  45. 'onUploadComplete': function(file, data) {
  46. opts.normalUploaded(opts.fileObjName,data);
  47. }
  48. });
  49. }

2.当头棒喝

  本地测试OK以后,放到测试环境上去测试,马上被震惊了。

  遇到的第一个问题就是在IE下很多时候点击没有反应(没有弹出文件选择框),找了半天原因终于找到了:必须在文档准备完全的时候再去初始化uploadify,而且确保上传input是可用的(非display:none)

  好了,可以选择文件了,但是选择文件以后IE8/9总是抛出call to startUpload failed异常,去网上查了一下,主要有几个原因

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

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

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

  如果觉得本文不错,请点击右下方【推荐】!

uploadify使用的一些经验总结的更多相关文章

  1. uploadify插件Http Error(302)错误记录(MVC)

    由于项目(asp.net MVC)需要做一个附件上传的功能,使用的是jQuery的Uploadify插件的2.1.0版本,上传文件到自己项目指定的文件夹下面.做完之后,在谷歌上测试是正确的,在火狐上报 ...

  2. 基于Metronic的Bootstrap开发框架经验总结(5)--Bootstrap文件上传插件File Input的使用

    Bootstrap文件上传插件File Input是一个不错的文件上传控件,但是搜索使用到的案例不多,使用的时候,也是一步一个脚印一样摸着石头过河,这个控件在界面呈现上,叫我之前使用过的Uploadi ...

  3. 基于MVC4+EasyUI的Web开发框架经验总结

    http://www.cnblogs.com/wuhuacong/p/4093778.html 在很多Web系统中,一般都可能提供一些图标的选择,方便配置按钮,菜单等界面元素的图 标,从而是Web系统 ...

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

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

  5. 基于Metronic的Bootstrap开发框架经验总结(7)--数据的导入、导出及附件的查看处理

    在很多系统模块里面,我们可能都需要进行一定的数据交换处理,也就是数据的导入或者导出操作,这样的批量处理能给系统用户更好的操作体验,也提高了用户录入数据的效率.我在较早时期的EasyUI的Web框架上, ...

  6. 基于MVC4+EasyUI的Web开发框架经验总结(14)--自动生成图标样式文件和图标的选择操作

    在很多Web系统中,一般都可能提供一些图标的选择,方便配置按钮,菜单等界面元素的图标,从而是Web系统界面看起来更加美观和协调.但是在系统中一般内置的图标样式相对比较有限,而且硬编码写到样式表里面,这 ...

  7. 基于MVC4+EasyUI的Web开发框架经验总结(13)--DataGrid控件实现自动适应宽带高度

    在默认情况下,EasyUI的DataGrid好像都没有具备自动宽度的适应功能,一般是指定像素宽度的,但是使用的人员计算机的屏幕分辨率可能不一样,因此导致有些地方显示太大或者太小,总是不能达到好的预期效 ...

  8. 基于MVC4+EasyUI的Web开发框架经验总结(12)--利用Jquery处理数据交互的几种方式

    在基于MVC4+EasyUI的Web开发框架里面,大量采用了Jquery的方法,对数据进行请求或者提交,方便页面和服务器后端进行数据的交互处理.本文主要介绍利用Jquery处理数据交互的几种方式,包括 ...

  9. 基于MVC4+EasyUI的Web开发框架经验总结(11)--使用Bundles处理简化页面代码

    在Web开发的时候,我们很多时候,需要引用很多CSS文件.JS文件,随着使用更多的插件或者独立样式文件,可能我们的Web界面代码会越来越臃肿,看起来也很累赘,在MVC里面提供了一个Bundle的对象, ...

随机推荐

  1. 菜鸟学Struts2——Interceptors

    昨天学习Struts2的Convention plugin,今天利用Convention plugin进行Interceptor学习,虽然是使用Convention plugin进行零配置开发,这只是 ...

  2. 关于全局ID,雪花(snowflake)算法的说明

    上次简单的说一下:http://www.cnblogs.com/dunitian/p/6041745.html#uid C#版本的国外朋友已经封装了,大家可以去看看:https://github.co ...

  3. HTML BOM Browser对象

    BOM:Browser Object Model,即浏览器对象模型,提供了独立于内容的.可以与浏览器窗口进行互动的对象结构. Browser对象:指BOM提供的多个对象,包括:Window.Navig ...

  4. pt-online-schema-change中update触发器的bug

    pt-online-schema-change在对表进行表结构变更时,会创建三个触发器. 如下文测试案例中的t2表,表结构如下: mysql> show create table t2\G . ...

  5. ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器

    原文:Filters 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:何镇汐 ASP.NET MVC 过滤器 可在执行管道的前后特定阶段执行代码.过滤器可以配置为全局有效.仅对控 ...

  6. spider RPC入门指南

    本部分将介绍使用spider RPC开发分布式应用的客户端和服务端. spider RPC中间件基于J2SE 8开发,因此需要确保服务器上安装了JDK 8及以上版本,不依赖于任何额外需要独立安装和配置 ...

  7. Android Fragment 剖析

    1.Fragment如何产生?2.什么是Fragment Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视.针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后 ...

  8. SEED实验系列文章目录

    美国雪城大学SEEDLabs实验列表 SEEDLabs是一套完整的信息安全实验,涵盖本科信息安全教学中的大部分基本原理.项目组2002年由杜文亮教授创建,目前开发了30个实验,几百所大学已采用.实验楼 ...

  9. Xamarin.Android通知详解

    一.发送通知的机制 在日常的app应用中经常需要使用通知,因为服务.广播后台活动如果有事件需要通知用户,则需要通过通知栏显示,而在Xamarin.Android下的通知需要获取Notification ...

  10. Visual Studio Code 配置指南

    Visual Studio Code (简称 VS Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器.在我看来它是「一款完美的编辑器」. 本文是有关 VS Code 的特性介绍与配置指 ...