zoukankan      html  css  js  c++  java
  • swfupload上传文件数量限制之setStats()

    使用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|缩略图地址|原图地址   这样的格式返回

    1. function uploadSuccess(file, serverData) {  
    2.     try {  
    3.         var result = serverData.split('|');  
    4.           
    5.         if(result[0] != 'success') {  
    6.             var progress = new FileProgress(file, this.customSettings.progressTarget);  
    7.             progress.setError();  
    8.             progress.setStatus(serverData);  
    9.             progress.toggleCancel(false);  
    10.         } else {  
    11.             var progress = new FileProgress(file, this.customSettings.progressTarget);  
    12.             progress.setComplete();  
    13.             progress.setStatus("上传完成");  
    14.             progress.toggleCancel(false);  
    15.             var img_url_s = result[1];  
    16.             var img_url_b = result[2];  
    17.             addImage(img_url_s,img_url_b);  
    18.         }  
    19.   
    20.     } catch (ex) {  
    21.         this.debug(ex);  
    22.     }  
    23. }  
    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);
    	}
    }
    1. function addImage(src_s,src_b) {  
    2.     var newDiv = parent.document.createElement("div");  
    3.     newDiv.style.margin = "5px";  
    4.     newDiv.style.height = "60px";  
    5.     newDiv.style.width = "80px";  
    6.     newDiv.style.border = "1px solid #7F9DB9";  
    7.     newDiv.style.cssFloat = "left";  
    8.     newDiv.style.styleFloat = "left";  
    9.     newDiv.style.position = "relative";  
    10.       
    11.     var newA = parent.document.createElement("a");  
    12.     newA.className = "delete";  
    13.     newA.title = "删除";  
    14.     newA.href = "javascript::";  
    15.     newA.onclick = function(){delDiv(newDiv);};  
    16.   
    17.     var newInput_s = parent.document.createElement("input");  
    18.     newInput_s.type = "hidden";  
    19.     newInput_s.value = src_s;  
    20.     newInput_s.name = "image_s[]";  
    21.   
    22.     newA.appendChild(newInput_s);  
    23.   
    24.     var newInput_b = parent.document.createElement("input");  
    25.     newInput_b.type = "hidden";  
    26.     newInput_b.value = src_b;  
    27.     newInput_b.name = "image_b[]";  
    28.   
    29.     newA.appendChild(newInput_b);  
    30.       
    31.     var newImgDiv = parent.document.createElement("div");  
    32.   
    33.     var newImg = parent.document.createElement("img");  
    34.     newImg.style.height = "60px";  
    35.     newImg.style.width = "80px";  
    36.   
    37.     newImgDiv.appendChild(newImg);  
    38.   
    39.     newDiv.appendChild(newImgDiv);  
    40.     newDiv.appendChild(newA);  
    41.     parent.document.getElementById("thumbImages").appendChild(newDiv);  
    42.   
    43.     if (newImg.filters) {  
    44.         try {  
    45.             newImg.filters.item("DXImageTransform.Microsoft.Alpha").opacity = 0;  
    46.         } catch (e) {  
    47.             // If it is not set initially, the browser will throw an error.  This will set it if it is not set yet.  
    48.             newImg.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + 0 + ')';  
    49.         }  
    50.     } else {  
    51.         newImg.style.opacity = 0;  
    52.     }  
    53.   
    54.     newImg.onload = function () {  
    55.         fadeIn(newImg, 0);  
    56.     };  
    57.     newImg.src = src_s;  
    58. }  
    59.   
    60. function fadeIn(element, opacity) {  
    61.     var reduceOpacityBy = 5;  
    62.     var rate = 30;  // 15 fps  
    63.   
    64.   
    65.     if (opacity < 100) {  
    66.         opacity += reduceOpacityBy;  
    67.         if (opacity > 100) {  
    68.             opacity = 100;  
    69.         }  
    70.   
    71.         if (element.filters) {  
    72.             try {  
    73.                 element.filters.item("DXImageTransform.Microsoft.Alpha").opacity = opacity;  
    74.             } catch (e) {  
    75.                 // If it is not set initially, the browser will throw an error.  This will set it if it is not set yet.  
    76.                 element.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + opacity + ')';  
    77.             }  
    78.         } else {  
    79.             element.style.opacity = opacity / 100;  
    80.         }  
    81.     }  
    82.   
    83.     if (opacity < 100) {  
    84.         setTimeout(function () {  
    85.             fadeIn(element, opacity);  
    86.         }, rate);  
    87.     }  
    88. }  
    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);
    	}
    }

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

    1. function queueComplete(numFilesUploaded) {  
    2.     this.setButtonDisabled(false);  
    3.     var stats = this.getStats();  
    4.     var status = document.getElementById("divStatus");  
    5.     status.innerHTML = "已上传 " + stats.successful_uploads + " 个文件,还可以上传"+ parseInt(this.settings['file_upload_limit']-stats.successful_uploads) +"个文件";  
    6. }  
    7.   
    8. function delDiv(mydiv) {  
    9.     mydiv.parentNode.removeChild(mydiv);  
    10.     //swfu参见iframe页面中的 swfu = new SWFUpload(settings);  
    11.     var stats = swfu.getStats();  
    12.     stats.successful_uploads--;  
    13.     swfu.setStats(stats);  
    14.     var status = document.getElementById("divStatus");  
    15.     status.innerHTML = "已上传 " + stats.successful_uploads + " 个文件,还可以上传"+ parseInt(swfu.settings['file_upload_limit']-stats.successful_uploads) +"个文件";  
    16. }  
    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里

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

    1. var img_arr = new Array();  
    2. {if isset($img_arr)}  
    3. {section name='img_arr' loop=$img_arr}  
    4. img_arr[{$smarty.section.img_arr.index}] = new Array('{$img_arr[img_arr].images_s}','{$img_arr[img_arr].images_b}');  
    5. {/section}  
    6. {/if}  
    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

    1. swfupload_loaded_handler : loaded,  
    swfupload_loaded_handler : loaded,

    再在handlers.js定义loaded函数

    1. function loaded() {  
    2.     if(img_arr.length != 0) {  
    3.         for( val in img_arr ) {  
    4.             addImageFromDb(img_arr[val][0],img_arr[val][1],this);  
    5.         }  
    6.     }  
    7. }  
    function loaded() {
    	if(img_arr.length != 0) {
    		for( val in img_arr ) {
    			addImageFromDb(img_arr[val][0],img_arr[val][1],this);
    		}
    	}
    }

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

    1. //初始化已经上传过的图片  
    2. function addImageFromDb(src_s,src_b,swfu) {  
    3.       
    4.     var stats = swfu.getStats();  
    5.     stats.successful_uploads++;  
    6.     swfu.setStats(stats);  
    7.     var status = document.getElementById("divStatus");  
    8.     status.innerHTML = "已上传<font color='green'>" + stats.successful_uploads + "</font>张,还可以上传<font color='red'>"+ parseInt(swfu.settings['file_upload_limit']-stats.successful_uploads) +"</font>张";  
    9.   
    10.     addImage(src_s,src_b);  
    11. }  
    //初始化已经上传过的图片
    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);
    }

    参考文档:http://leeon.me/upload/other/swfupload.html

                        http://hi.baidu.com/e_polo/blog/item/232745182e3dbbb84aedbcf7.html

                        http://addcn.blogbus.com/logs/157496180.html

  • 相关阅读:
    C#中委托和事件的区别
    Linux centos7 计划任务与日志的管理
    linux shell检查字符串是否是IP
    Linux脚本中$#、$0、$1、$@、$*、$$、$?
    Linux命令学习之shift命令
    CentOS7编写systemd服务脚本
    java数据类型转换
    centos7 升级openssh到openssh-8.3p1版本
    oracle的簇的创建
    oracle 分区表的维护
  • 原文地址:https://www.cnblogs.com/wangjingblogs/p/3713218.html
Copyright © 2011-2022 走看看