惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
The Register - Security
The Register - Security
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The GitHub Blog
The GitHub Blog
博客园 - 司徒正美
罗磊的独立博客
U
Unit 42
S
SegmentFault 最新的问题
Y
Y Combinator Blog
博客园_首页
Hugging Face - Blog
Hugging Face - Blog
J
Java Code Geeks
Schneier on Security
Schneier on Security
Know Your Adversary
Know Your Adversary
C
Check Point Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Simon Willison's Weblog
Simon Willison's Weblog
V
Vulnerabilities – Threatpost
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
阮一峰的网络日志
阮一峰的网络日志
The Hacker News
The Hacker News
博客园 - 叶小钗
C
Cybersecurity and Infrastructure Security Agency CISA
Spread Privacy
Spread Privacy
L
LINUX DO - 热门话题
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Latest news
Latest news
L
Lohrmann on Cybersecurity
A
About on SuperTechFans
L
LangChain Blog
Stack Overflow Blog
Stack Overflow Blog
S
Securelist
A
Arctic Wolf
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Threatpost
Scott Helme
Scott Helme
博客园 - 聂微东
博客园 - 【当耐特】
T
Tenable Blog
I
Intezer
D
DataBreaches.Net
B
Blog RSS Feed
Security Latest
Security Latest
C
Cisco Blogs
T
Tor Project blog
N
Netflix TechBlog - Medium

博客园 - peace

MYSQL分页存储过程及事务处理 审批流设计方案的探究 WEB项目(B/S系统)打包安装(总结篇) 文件上传之断点续传方案 SQL SERVER里的赋值机制闲聊 FLEX4.0开发流媒体视频播放器(总结篇) 告别ADO.NET实现应用系统无缝切换的烦恼(总结篇) SQL SERVER行转列应用小结 SQL SERVER函数——表值函数的处理 纠正网上流传的SQL取某一时间的当月第一天和最后一天的时间写法 SQL SERVER游标操作 告别.NET生成报表统计图的烦恼 发现联想手机P630型号的一个严重的系统Bug thinkpad T400型号安装server2003系统驱动共享 分享一个.NET版的多选文件上传操作示例 一个简单的httpModule应用 JS给页面标签添加事件(或超链接链接) 让默认焦点的按钮无虚框(又来无聊了) 利用ASP.NET日期控件制作“会议日程安排”(贴首页过把瘾)
再次分享一个多选文件上传方案
peace · 2011-04-06 · via 博客园 - peace

     多选文件上传,已经非常多了,选择性多了可能有时候要比较下哪个更合适,结合到项目中使用更方便才是最重要的。很多的多选上传基本上都是调用的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打开)