再次分享一个多选文件上传方案
???? 多選文件上傳,已經非常多了,選擇性多了可能有時候要比較下哪個更合適,結合到項目中使用更方便才是最重要的。很多的多選上傳基本上都是調用的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!=0)?return;
????????????????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
總結
以上是生活随笔為你收集整理的再次分享一个多选文件上传方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java基础全套
- 下一篇: uplift 模型开源包(causalm