SWFUpload多文件上传及文件个数限制的方法


Posted in Javascript onMay 31, 2016

本文实例讲述了SWFUpload多文件上传及文件个数限制的方法。分享给大家供大家参考,具体如下:

SWFUpload是一个基于flash与JavaScript的客户端文件上传组件。

handlers.js文件

完成文件入列队(fileQueued) →
完成选择文件(fileDialogComplete) → 开始上传文件(uploadStart) → 上传处理(uploadProgress) → 上传成功(uploadSuccess) → 上传完成(uploadComplete)  →
列队完成(queueComplete)

如上所示,单选文件顺序执行以上回调函数,需要注意的是选择多个文件,fileQueued、queueComplete只会执行一次,而fileDialogComplet...→ uploadComplete每个文件都执行一次。

参考官方例子完成基本功能后,仿赶集采用iframe的方式

为了实现缩略图预览 以及删除 和上传图片个数的限制

显示缩略图,生成删除缩略图的按钮,

thumbImages为父页面显示缩略图的div
src_s为生成的缩略图地址
src_b为原图地址
serverData是图片上传处理页面返回的数据 成功则以    success|缩略图地址|原图地址   这样的格式返回

function uploadSuccess(file, serverData) {
  try {
    var result = serverData.split('|');
    if(result[0] != 'success') {
      var progress = new FileProgress(file, this.customSettings.progressTarget);
      progress.setError();
      progress.setStatus(serverData);
      progress.toggleCancel(false);
    } else {
      var progress = new FileProgress(file, this.customSettings.progressTarget);
      progress.setComplete();
      progress.setStatus("上传完成");
      progress.toggleCancel(false);
      var img_url_s = result[1];
      var img_url_b = result[2];
      addImage(img_url_s,img_url_b);
    }
  } catch (ex) {
    this.debug(ex);
  }
}
function addImage(src_s,src_b) {
  var newDiv = parent.document.createElement("div");
  newDiv.style.margin = "5px";
  newDiv.style.height = "60px";
  newDiv.style.width = "80px";
  newDiv.style.border = "1px solid #7F9DB9";
  newDiv.style.cssFloat = "left";
  newDiv.style.styleFloat = "left";
  newDiv.style.position = "relative";
  var newA = parent.document.createElement("a");
  newA.className = "delete";
  newA.title = "删除";
  newA.href = "javascript::";
  newA.onclick = function(){delDiv(newDiv);};
  var newInput_s = parent.document.createElement("input");
  newInput_s.type = "hidden";
  newInput_s.value = src_s;
  newInput_s.name = "image_s[]";
  newA.appendChild(newInput_s);
  var newInput_b = parent.document.createElement("input");
  newInput_b.type = "hidden";
  newInput_b.value = src_b;
  newInput_b.name = "image_b[]";
  newA.appendChild(newInput_b);
  var newImgDiv = parent.document.createElement("div");
  var newImg = parent.document.createElement("img");
  newImg.style.height = "60px";
  newImg.style.width = "80px";
  newImgDiv.appendChild(newImg);
  newDiv.appendChild(newImgDiv);
  newDiv.appendChild(newA);
  parent.document.getElementById("thumbImages").appendChild(newDiv);
  if (newImg.filters) {
    try {
      newImg.filters.item("DXImageTransform.Microsoft.Alpha").opacity = 0;
    } catch (e) {
      // If it is not set initially, the browser will throw an error. This will set it if it is not set yet.
      newImg.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + 0 + ')';
    }
  } else {
    newImg.style.opacity = 0;
  }
  newImg.onload = function () {
    fadeIn(newImg, 0);
  };
  newImg.src = src_s;
}
function fadeIn(element, opacity) {
  var reduceOpacityBy = 5;
  var rate = 30; // 15 fps
  if (opacity < 100) {
    opacity += reduceOpacityBy;
    if (opacity > 100) {
      opacity = 100;
    }
    if (element.filters) {
      try {
        element.filters.item("DXImageTransform.Microsoft.Alpha").opacity = opacity;
      } catch (e) {
        // If it is not set initially, the browser will throw an error. This will set it if it is not set yet.
        element.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + opacity + ')';
      }
    } else {
      element.style.opacity = opacity / 100;
    }
  }
  if (opacity < 100) {
    setTimeout(function () {
      fadeIn(element, opacity);
    }, rate);
  }
}

关于剩余可上传文件个数的处理

function queueComplete(numFilesUploaded) {
  this.setButtonDisabled(false);
  var stats = this.getStats();
  var status = document.getElementById("divStatus");
  status.innerHTML = "已上传 " + stats.successful_uploads + " 个文件,还可以上传"+ parseInt(this.settings['file_upload_limit']-stats.successful_uploads) +"个文件";
}
function delDiv(mydiv) {
  mydiv.parentNode.removeChild(mydiv);
  //swfu参见iframe页面中的 swfu = new SWFUpload(settings);
  var stats = swfu.getStats();
  stats.successful_uploads--;
  swfu.setStats(stats);
  var status = document.getElementById("divStatus");
  status.innerHTML = "已上传 " + stats.successful_uploads + " 个文件,还可以上传"+ parseInt(swfu.settings['file_upload_limit']-stats.successful_uploads) +"个文件";
}

可能是由于使用iframe的关系

delDiv函数里的swfu不能用this代替

整体效果如下图:

SWFUpload多文件上传及文件个数限制的方法

当上传完图片后,再次修改信息时,需要取已经上传了多少个图片,结合到swfupload里

通过php从后台取到已上传的图片路径,通过smarty给到一个js数组里

var img_arr = new Array();
{if isset($img_arr)}
{section name='img_arr' loop=$img_arr}
img_arr[{$smarty.section.img_arr.index}] = new Array('{$img_arr[img_arr].images_s}','{$img_arr[img_arr].images_b}');
{/section}
{/if}

查询swfupload文档得到如下资料

flashReady()

该事件函数是内部事件,因此不能被重写。当SWFupload实例化,加载的FLASH完成所有初始化操作时触发此事件。

提醒:对应设置中的自定义事件swfupload_loaded_handler
于是通过swfupload的settings里设置 swfupload_loaded_handler

swfupload_loaded_handler : loaded,
再在handlers.js定义loaded函数

function loaded() {
  if(img_arr.length != 0) {
    for( val in img_arr ) {
      addImageFromDb(img_arr[val][0],img_arr[val][1],this);
    }
  }
}

调用addImageFromDb函数 修改已上传的图片数量 并且生成已上传的图片的缩略图

//初始化已经上传过的图片
function addImageFromDb(src_s,src_b,swfu) {
  var stats = swfu.getStats();
  stats.successful_uploads++;
  swfu.setStats(stats);
  var status = document.getElementById("divStatus");
  status.innerHTML = "已上传<font color='green'>" + stats.successful_uploads + "</font>张,还可以上传<font color='red'>"+ parseInt(swfu.settings['file_upload_limit']-stats.successful_uploads) +"</font>张";
  addImage(src_s,src_b);
}

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
Mar 10 Javascript
JQuery 无废话系列教程(一) jquery入门 [推荐]
Jun 23 Javascript
jQuery截取指定长度字符串代码
Aug 21 Javascript
jQuery选择器全集详解
Nov 24 Javascript
jQuery的load()方法及其回调函数用法实例
Mar 25 Javascript
jQuery 实现评论等级好评差评特效
May 06 Javascript
String字符串截取的四种方式总结
Nov 28 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
May 17 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
Nov 03 Javascript
详解React Native 采用Fetch方式发送跨域POST请求
Nov 15 Javascript
浅谈react-router HashRouter和BrowserRouter的使用
Dec 29 Javascript
详解基于Wepy开发小程序插件(推荐)
Aug 01 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
May 31 #Javascript
javascript事件模型介绍
May 31 #Javascript
使用JavaScript实现弹出层效果的简单实例
May 31 #Javascript
javascript事件处理模型实例说明
May 31 #Javascript
jQuery基础知识点总结(必看)
May 31 #Javascript
浅谈JavaScript中小数和大整数的精度丢失
May 31 #Javascript
javascript小数精度丢失的完美解决方法
May 31 #Javascript
You might like
《星际争霸重制版》兵种对比图鉴
2020/03/02 星际争霸
星际争霸 Starcraft 游戏介绍
2020/03/14 星际争霸
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
2012/07/02 PHP
PHP获取当前日期和时间及格式化方法参数
2015/05/11 PHP
$.ajax json数据传递方法
2008/11/19 Javascript
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
在浏览器中实现图片粘贴的jQuery插件-- pasteimg使用指南
2014/12/29 Javascript
js基础知识(公有方法、私有方法、特权方法)
2015/11/06 Javascript
js点击返回跳转到指定页面实现过程
2020/08/20 Javascript
基于JS实现密码框(password)中显示文字提示功能代码
2016/05/27 Javascript
JavaScript的this关键字的理解
2016/06/18 Javascript
JS使用ActiveXObject实现用户提交表单时屏蔽敏感词功能
2017/06/20 Javascript
jQuery、layer实现弹出层的打开、关闭功能
2017/06/28 jQuery
vue webuploader 文件上传组件开发
2017/09/23 Javascript
vue中本地静态图片路径写法
2018/03/06 Javascript
vue生成token并保存到本地存储中
2018/07/17 Javascript
layerUI下的绑定事件实例代码
2018/08/17 Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
2019/04/15 Javascript
layui上传图片到服务器的非项目目录下的方法
2019/09/26 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
2019/11/18 jQuery
JavaScript实现京东放大镜效果
2019/12/03 Javascript
[05:53]完美世界携手游戏风云打造 卡尔工作室观战系统篇
2013/04/22 DOTA
[10:53]2018DOTA2国际邀请赛寻真——EG
2018/08/11 DOTA
[53:36]Liquid vs VP Supermajor决赛 BO 第三场 6.10
2018/07/05 DOTA
Linux下编译安装MySQL-Python教程
2015/02/02 Python
各个系统下的Python解释器相关安装方法
2015/10/12 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
2018/04/27 Python
python3利用venv配置虚拟环境及过程中的小问题小结
2018/08/01 Python
Python基础学习之类与实例基本用法与注意事项详解
2019/06/17 Python
求职者简历中的自我评价
2013/10/20 职场文书
采购部主管岗位职责
2014/01/01 职场文书
反对邪教标语
2014/06/30 职场文书
2016年助残日旅游活动总结
2016/04/01 职场文书
2016年全国爱眼日宣传教育活动总结
2016/04/05 职场文书
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js