這個仿163網盤無刷新文件上傳系統,并沒有用使用.NET的控件,完全的手工制作。前臺基本上是靜態的,跟后臺沒有關系,所以后臺用什么語言做都可以(后面有各個版本的實例下載)。
本來覺得這個系統會很復雜,但把每個部分都分析清楚后,其實需要的技術并不高。不過當我把各個功能函數都整理好準備進行封裝時,卻發現要把程序封裝不是那么容易,因為程序跟html的耦合度太高。然后我逐步把程序中操作html相關的部分分離出來,首先把簡單的分離,接著是文件列表,然后是file控件,最后是一些提示性程序。經過幾次嘗試才把整個結構封裝好,現在程序結構應該算比較清晰,有什么不明白的地方歡迎留言。
效果預覽
上傳文件 | |||
添加文件: | ![]() | ||
| |||
溫馨提示:最多可同時上傳 個文件,只允許上傳 文件。 | |||
程序說明
【無刷新上傳】
要實現文件上傳,form必須設置幾個屬性:
1.action:設為要處理數據的頁面地址;
2.method:設為"post";
3.enctype/encoding:必須設為"multipart/form-data",這里要注意的是在ie中用js修改form的enctype屬性是沒有效果的,只能修改encoding;
后面兩個屬性程序初始化時都有設置:
this.Form.method = "post";this.Form.encoding = "multipart/form-data";
【多文件上傳】
對于多文件上傳,這里的目的是如何做到163網盤那樣,只用一個file控件就實現多文件上傳。
這里參考了163網盤的思路,下面說說如何實現:
首先必須有一個文件空間(我自己定的名字),例如程序中的"idFile"對象,這個空間不需要內容甚至一個div就可以,主要是用來存放file控件,程序中Folder屬性就是這個文件空間對象。
ps:這里的要求是把file控件都控制在文件空間里,即使不是單file控件的情況。
再說說Files屬性,這個屬性放的是file控件集合,方便獲取file控件,在下面“文件列表”就會用到。
處理這些file控件的程序主要在Ini函數中:
首先是處理文件空間中的file控件:


this.Files = [];
//整理文件空間,把有值的file放入文件集合
Each(this.Folder.getElementsByTagName("input"), Bind(this, function(o){
if(o.type == "file"){ o.value && this.Files.push(o); this.onIniFile(o); }
}))
【文件列表】
在上面的Ini函數中,最后執行了一個附加函數onIni,這個函數是用戶自己定義的,我就在這個函數中添加文件列表。
在之前先說說添加文件列表的函數AddList,這個函數是用來把file控件的值列在一個table里面。
函數的參數是一個二維數組,其中第一維是行(tr),第二維是列(td)。
首先獲取列表對象FileList,再定義一個文檔碎片oFragment來操作dom:
【后臺】
前臺基本完成了,就到后臺啦。后臺的功能很簡單,就是處理傳遞過來的文件數據。
這里像js + .NET 圖片切割系統那樣使用ashx文件處理IHttpHandler發送過來的數據。
程序很簡單,就直接貼代碼了:


int iTotal = context.Request.Files.Count;
if (iTotal == 0)
{
_msg = "沒有數據";
}
else
{
int iCount = 0;
for (int i = 0; i < iTotal; i++)
{
HttpPostedFile file = context.Request.Files[i];
if (file.ContentLength > 0 || !string.IsNullOrEmpty(file.FileName))
{
//保存文件
file.SaveAs(System.Web.HttpContext.Current.Server.MapPath("./file/" + Path.GetFileName(file.FileName)));
//這里可以根據實際設置其他限制
if (++iCount > UploadFileLimit)
{
_msg = "超過上傳限制:" + UploadFileLimit;
break;
}
}
}
}
NET技術:仿163網盤無刷新文件上傳系統,轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。