再次分享一个多选文件上传方案

     多选文件上传,已经非常多了,选择性多了可能有时候要比较下哪个更合适,结合到项目中使用更方便才是最重要的。很多的多选上传基本上都是调用的swf文件,确实用flash 或flex开发一个多选上传的功能很方便,比如flex里内置的FileReferenceList对象本身就支持文件的多选,有这个的话就方便多了,下面要说的主要也是基于flex开发的一个多选上传功能。

  主要实现的功能如下:

  一、选择多个文件上传并显示单个文件的上传进度

  二、显示所有文件总的上传进度

  三、显示所有上传文件的总大小

  四、上传前可以删除任意选定一个或多个文件(按住Ctrl或Shift键)

  五、ASP.NET页面调用生成的swf文件异步上传到服务器

  先看下演示的截图,如下:

     

 

 

    

 

    

 

    

 

    

 

    大致功能和上面截图一样,下面主要说下ASP.NET里怎么调用,FLEX的里面代码我这里就不详细说明了,FLEX里面的代码不多,文章后面提供下载,用flex3.0或4.0可以打开运行。

    其中有一个地方说明一下,就是在多选删除的地方,为了保证随意多选删除的正确性,需要把选定的索引项降序排序,每次从数组最大处删除,避免循环删除时索引超界

     

function deleteItem():void{
                    
var selectItems:Array = process_list.selectedItems;
                    
var selectIndex:Array = process_list.selectedIndices;
                    selectIndex 
= selectIndex.sort(2);//索引按降序排序
                    var iCount:int = selectItems.length;
                    
var sizeMum:Number = 0;
                    
for(var i:int=0;i<iCount;i++){
                        info.splice(selectIndex[i],
1);
                        fileRef.fileList.splice(selectIndex[i],
1);//移除的选择项按索引从大到小移除,以便移除过程中索引不超界
                    }
                    
for(var j:Number=0;j<fileRef.fileList.length;j++){                        
                        sizeMum
+=fileRef.fileList[j].size;                    
                    }            
                    process_list.dataProvider 
= info;
                    tip_txt.text
=""+fileRef.fileList.length+"个文件  "+(sizeMum/(1024*1024)).toFixed(4).toString()+"MB";
                                        
                    
if(info.length<=0){
                        delete_btn.enabled 
= false;
                    }                    
                }

  调用其实也比较简单,新建一个aspx页面加载生成的swf文件,这里生成的文件名是upload.swf,利用flex内置的swfobject.js里面的方法加载,如下:

  

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    
<title>无标题页</title>     
            <style type="text/css" media="screen"> 
            html, body    { height:
100%; }
            body { margin:
0; padding:0; overflow:auto; text-align:center; 
                   background
-color: #ffffff; }   
            #flashContent { display:none; }
        
</style>
            
        
<script type="text/javascript" src="swfobject.js"></script>   
        <script type="text/javascript" >

            
var swfVersionStr = "10.0.0";
            
var xiSwfUrlStr = "playerProductInstall.swf";
            
var flashvars = {};
            flashvars.url 
= "SaveFile.aspx?Param=ID|100,NAME|测试用户";
            
var params = {};
            params.quality 
= "high";
            params.bgcolor 
= "#ffffff";
            params.allowscriptaccess 
= "sameDomain";
            params.allowfullscreen 
= "true";
            
var attributes = {};
            attributes.id 
= "upload";
            attributes.name 
= "upload";
            attributes.align 
= "middle";
            swfobject.embedSWF(
                
"upload.swf""flashContent"
                
"587""370"
                swfVersionStr, xiSwfUrlStr, 
                flashvars, params, attributes);
    
            
function uploadCompelete(){
                
//完成后的操作,如页面跳转或关闭当前页
                document.getElementById('btnUpload').disabled = false;
            }
            
function submitForm(){
                thisMovie(
"upload").uploadfile();
            }
            
function thisMovie(movieName) {
                
if (navigator.appName.indexOf("Microsoft"!= -1) {
                    
return window[movieName];
                } 
else {
                    
return document[movieName];
                }
            }
            
function disabledButton()
             {
                document.getElementById(
'btnUpload').disabled = true;
             }
    
        
</script>
</head>
<body>
   
<div id="flashContent"  style="width:587px; height:380px">
            
</div>
        <br />
        <input id="btnUpload" style="width: 71px" type="button" value="上 传" onclick="submitForm()" />
</body>
</html>

  如上,页面放置一个按钮,执行upload.swf里面的uploadfile方法,在flex里面其实是回调了uploadHandler方法:

   

//===================
            // 点击上传按钮
            //===================
            internal function uploadHandler():void{
                
if(uploadFile_num!=0return;
                
if(process_list.dataProvider==null || info.length<=0){
                    Alert.show(
"您还未选择文件!","提示信息");
                    
return;
                }
                
else
                {
                    ExternalInterface.call(
"disabledButton"); //点上传后禁用按钮 
                }
                
for(var i:Number=0;i<fileRef.fileList.length;i++){                
                    upload_size_total
+=fileRef.fileList[i].size;                                        
                }                                    
                uploadfile(uploadFile_num);    
                add_btn.enabled 
= false//点上传后禁用浏览按钮 
                delete_btn.enabled = false;//点上传后禁用删除按钮 
            }

    SaveFile.aspx页面主要是接收并存储文件,如下:

  

 protected void Page_Load(object sender, EventArgs e)
    {
        
//string param = Request["Param"];
        string path = Server.MapPath("files/");
        
if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }
        
//HttpFileCollection files = Request.Files;
        //string fileName = string.Empty;
        //for (int i = 0; i < files.Count; i++)
        //{
        //    fileName = Path.GetFileName(files[i].FileName).ToLower();
        //    files[i].SaveAs(path + fileName);
        //}
        HttpPostedFile file = Request.Files["Filedata"]; //文件是一个一个异步提交过来,所以不需要循环文件集合
        if (file != null && file.ContentLength > 0)
        {
            file.SaveAs(path
+Request.Form["filename"]);
        }
    }

  毕竟不是以文件流的形式接收和存储,所以如果是上传大文件的话,可以看到显示页面已经上传完成100%,但是到这个处理存储页面会停顿一会,接收并存储完成后前台页面才会反应过来。

  还有一点要提一下,就是如果传递的参数包含中文的话,需要config编码格式为utf-8格式,但有原先的系统可能是gb2312格式的,改成utf-8可能对系统有影响,可以单独建一个webconfig,上传的时候就读单独的config。查了下说flash.system.System.useCodePage=true;设置可以解决中文乱码问题,我试了下还是不好用,最后还是修改的编码格式。

 

  源码下载:flex多选文件上传 (用VS2005及以上或flashbuilder3.0,4.0打开)

 

转载于:https://www.cnblogs.com/peaceli/archive/2011/04/06/flex_multi_upload.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2017软件工程实践总结

一、请回望暑假时的第一次作业&#xff0c;你对于软件工程课程的想象 1&#xff09;对比开篇博客你对课程目标和期待&#xff0c;“希望通过实践锻炼&#xff0c;增强计算机专业的能力和就业竞争力”&#xff0c;对比目前的所学所练所得&#xff0c;在哪些方面达到了你的期待和…

mysql use mysql_1、设置mysql远程访问执行mysql 命令进入mysql 命令模式,执行如下SQL代码mysql use mysql; mysql GRANT ALL ON ...

1、设置mysql远程访问执行mysql 命令进入mysql 命令模式&#xff0c;执行如下SQL代码mysql> use mysql;mysql> GRANT ALL ON *.* TO admin% IDENTIFIED BY admin WITH GRANT OPTION;# 这句话的意思 &#xff0c;允许任何IP地址(上面的 % 就是这个意思)的电脑 用admin帐户…

HTTP 头部解释,HTTP 头部详细分析,最全HTTP头部信息

HTTP 头部解释 1. Accept&#xff1a;告诉WEB服务器自己接受什么介质类型&#xff0c;*/* 表示任何类型&#xff0c;type/* 表示该类型下的所有子类型&#xff0c;type/sub-type。2. Accept-Charset&#xff1a; 浏览器申明自己接收的字符集Accept-Encoding&#xff1a; 浏览…

shell编辑crontab任务

crontab是Linux下执行定时任务的工具&#xff0c;之前偶尔需要用到时都是通过执行crontab -e命令或者通过root身份直接编辑/etc/cron.*/下的文件来添加定时任务。这段时间遇到了需要通过shell来自动添加或删除crontab的需求。在shell中无法通过crontab -e来与crontab编辑器交互…

条码生成代码(Code39码)

zryou 的 条码生成代码(Code39码)『Code 39条形码介绍』 code39条码能表示字母、数字和其它一些符号共43个字符&#xff1a;A -Z, 0-9, -.$/ %, space等&#xff0c;其主要特点如下&#xff1a;  ◆条码的长度是可变化的   ◆通常用“*”号作为起始、终止符   ◆校验码不…

mysql那些事(6) WHERE条件 字符串的引号

前言&#xff1a;所谓的坑&#xff0c;两个意思&#xff0c;一个是软件本身的bug&#xff0c;一个是使用者常犯的错误。 phper在日常开发中经常和mysql打交道。特别是在没有分层的中小应用中&#xff0c;phper开发要关注sql语句的实现。 入正题&#xff0c;上建表语句&#xff…

mysql延迟关联为什么快_MySQL 覆盖索引与延迟关联详解

本期来谈谈覆盖索引与延迟关联。在此之前&#xff0c;我们先简单建立一个订单表 Orders 用于举例说明。表中共包含 3 个字段&#xff1a;idintproduct_idnameCREATETABLEordersidint10NOTNULLCOMMENT订单 IDproduct_idint10DEFAULTNULLCOMMENT商品 IDnamevarchar255CHARACTERSE…

学一下Unix/C啊

发信人: Winmine (挖地雷), 信区: Career_Upgrade标 题: Oracle(原bea)研发中心Tuxedo组&#xff0c;招Unix/C人才发信站: 水木社区 (Mon Apr 11 13:28:06 2011), 站内工作地点在中关村软件园&#xff0c;西二旗附近。要求至少2年相关工作经验----但一般来说&#xff0c;除非您…

Qt使用信号与槽时出现的错误“Incompatible sender/receiver arguments”

在学习使用qt的过程中&#xff0c;没有好好的去了解信号与槽的机制&#xff0c;导致出现了这么一段代码&#xff1a; connect(timer1, SIGNAL(timeout()), this, SLOT(exeMonitor(QString))); 在编译时没有出现错误&#xff0c;但当触发该信号时输出框显示&#xff1a; 即&…

mysql通过函数完成10的阶乘_请使用函数的递归调用编写求阶乘的函数,并计算1!+2!+3!+4!+5!...

点击查看请使用函数的递归调用编写求阶乘的函数,并计算1!+2!+3!+4!+5!具体信息 答:include "stdio.h" int fac(int k) { if(k==1) return 1; else return k*fac(k-1); }/*递归求阶乘*/ void main() { int i=1; for(i;i=5;i++) { fac(i);/*调用函数计算阶乘*/…

《大话数据结构》第9章 排序 9.3 冒泡排序(上)

9.3.1 最简单排序实现 无论你学习哪种编程语言&#xff0c;在学到循环和数组时&#xff0c;通常都会介绍一种排序算法来作为例子&#xff0c;而这个算法一般就是冒泡排序。并不是它的名称很好听&#xff0c;而是说这个算法的思路最简单&#xff0c;最容易理解。因此&…

简易js模板引擎

前阵子参考别人的文章自己理解了一下模板引擎的实现&#xff0c;虽然是照着敲了一边&#xff0c;但是自己也加深了理解吧。 原文链接 自己的代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><ti…

五款常用邮件管理系统评测

以邮件为主要沟通媒介的外贸企业&#xff0c;对邮件的依赖性可以说已经达到不能或缺的地步。软件厂商们深谙这一定律&#xff0c;为外贸企业提供了种类庞大的软件系统以供选择。以下笔者抽出其中五款使用较为普遍的邮件管理系统&#xff0c;根据其性能、系统稳定性、性价比等方…

for each java_Java 实例 - for 和 foreach循环使用

Java 实例 - for 和 foreach循环使用for 语句比较简单&#xff0c;用于循环数据。for循环执行的次数是在执行前就确定的。语法格式如下&#xff1a;for(初始化; 布尔表达式; 更新) {//代码语句}foreach语句是java5的新特征之一&#xff0c;在遍历数组、集合方面&#xff0c;for…

EditPlus 注册码在线生成

虽然editplus现在不常用&#xff0c;但是它轻便&#xff0c;我还是很喜欢的&#xff0c;推荐一个注册码生成器&#xff0c;真是好好用 http://www.jb51.net/tools/editplus/ 点击链接输入自己想要的用户名&#xff0c;就能自动生成了&#xff0c;相当方便。转载于:https://www.…

如何启用 Ubuntu 中的 root 帐号

执行下面的操作&#xff1a; sudo passwd root 此命令将会重新设置 root 的密码&#xff0c;按照提示输入新的密码&#xff0c;并加以确认。 之后&#xff0c;重启系统时&#xff0c;就可以用 root 登录了。 如果你想要禁用 root 帐号&#xff0c;则执行下列命令&#xff1a; …

java代码块的定义_Java几种代码块的定义与常见问题

Java几种代码块的定义与常见问题代码块&#xff0c;通俗的说就是用一对“{}”括起来的一段代码&#xff0c;代码块可以根据位置分为以下几类&#xff1a;局部代码块&#xff1a;局部代码块就是指直接在方法或是语句中定义的代码块&#xff0c;请看如下范例&#xff1a;package …

gradle各版本下载地址

gradle各版本下载地址 原创 2016年08月16日 11:17:25标签&#xff1a;gradle更新 /android studio59713gradle各版本下载地址&#xff1a;http://services.gradle.org/distributions 以前都是手动下载gradle的文件&#xff0c;然后修改的&#xff0c;今天想从一些博客网站上下载…

SUSE中LVM的使用心得

一、服务器分区规划(按100个商务群规划&#xff0c;可扩展) myvg卷组容量&#xff0d;&#xff0d;700G(硬盘空间的80%左右) /boot 100M 用于系统启用需要的空间 / 20G 用于放置一些系统用户文件 /usr 150G    用于tomcat&#xff1a;发布程序…

thinkphp 5数据库操作

1、原生sql $optionsDb::table(__MALL_POST__) ->alias(m) ->join(__MALL_CATEGORY_VALUE__ v,m.id v.itemid) ->join(__MALL_CATEGORY_OPTION__ o,v.oid o.oid) ->where(m.id,$articleId) ->select(); 参见 &#xff1a;https://www.kancloud.cn/manual/thin…