談ASP.NET多附件上傳和附件編輯的實(shí)現(xiàn)_.Net教程
推薦:小議程序員的信仰老婆經(jīng)�?湮矣邢敕ǎ靡嬗诶掀糯笕说墓膭�(lì),我才打算將自己平時(shí)所想,所總結(jié)的東西寫下來。人是需要不斷總結(jié)的,有總結(jié)才會(huì)有進(jìn)步。所謂總結(jié),并不一定是多么高深的道理,多么復(fù)雜的推論,也并不一定要長(zhǎng)篇大論。有時(shí),一句話,或是一個(gè)瞬間,會(huì)讓你明白很
在寫這篇文章之前我也在Google上找到了很多有關(guān)多附件上傳的文章,有用ASP.NET實(shí)現(xiàn)的,也有用JSP、PHP等其它技術(shù)實(shí)現(xiàn)的,但基本前提都是事先通過js腳本來動(dòng)態(tài)創(chuàng)建DOM,然后上傳的時(shí)候在服務(wù)端做一下處理,有點(diǎn)類似于163的郵件系統(tǒng)。文件上傳需要通過頁(yè)面的POST方法進(jìn)行提交,這個(gè)我在一次MOSS開發(fā)中iFrame表單提交的古怪問題解決一問中已經(jīng)闡述過,其中包括了如何使用頁(yè)面隱藏的iFrame來提交表單從而避免整個(gè)頁(yè)面提交到服務(wù)器而導(dǎo)致頁(yè)面的刷新。多附件上傳的原理與之類似,只不過需要事先通過腳本在頁(yè)面上動(dòng)態(tài)創(chuàng)建多個(gè)input type='file'的標(biāo)簽,當(dāng)然,如果要想功能更加完美,你可能還需要通過腳本動(dòng)態(tài)添加一些按鈕事件以讓用戶可以刪除他所添加的文件。下面是一個(gè)應(yīng)用效果的截圖。

其中紅色方框內(nèi)的內(nèi)容是通過腳本在頁(yè)面上動(dòng)態(tài)創(chuàng)建的,將用戶在客戶端所選文件的文件名動(dòng)態(tài)添加到一個(gè)div里,同時(shí)在這個(gè)div中放一個(gè)隱藏的input type=’file’的標(biāo)簽,它的value為用戶所選文件的路徑,然后在div中放置一個(gè)img,添加onmouseover和onmouseout事件為圖片增加了一些鼠標(biāo)滑動(dòng)時(shí)的效果,onclick事件用來響應(yīng)用戶點(diǎn)擊img時(shí)刪除對(duì)應(yīng)的文件�?匆幌麓a中的具體實(shí)現(xiàn)。
|
以下為引用的內(nèi)容: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %> |
|
以下為引用的內(nèi)容: protected void Page_Load(object sender, EventArgs e) |
代碼建立在Ajax.net基礎(chǔ)之上,環(huán)境是Visual Studio 2008 + Windows 2003,測(cè)試通過!
簡(jiǎn)單做一下說明:
1. <div id="saveshoutoutimg" runat="server"/>用來存放動(dòng)態(tài)添加的文件相關(guān)標(biāo)簽。
2. btAddImage被點(diǎn)擊后自身將被disabled掉,然后顯示saveshoutoutaddimgs整個(gè)div。
3. 在saveshoutoutaddimgs中用戶可以完成文件的選取和確認(rèn)操作,chkAgree用來enable btAdd按鈕。
4. 當(dāng)用戶點(diǎn)擊btAdd時(shí),觸發(fā)onclick事件,該事件在code-behind的Page_Load方法中注冊(cè),因?yàn)槟_本中涉及到使用服務(wù)端控件的ClientID屬性,這樣寫比較方便。
5. 客戶端函數(shù)addImg用來完成動(dòng)態(tài)DOM的添加操作,它接收三個(gè)參數(shù),第一個(gè)參數(shù)targetElement表示存放動(dòng)態(tài)DOM的宿主DIV,第二個(gè)參數(shù)savestatsElement表示用于保存已添加文件信息的隱藏文本框,第三個(gè)參數(shù)oldimgElement表示用于保存在編輯狀態(tài)下用戶上一次上傳的文件信息隱藏文本框。基本思路是復(fù)制browseimg下的input type="file"標(biāo)簽,然后將動(dòng)態(tài)生成的DOM添加到saveshoutoutimgs下,并同時(shí)附加了一些事件。
6. tbImgs隱藏文本框用來保存用戶已選文件的信息,以"|文件名1|文件名2|文件名3|..."的格式存放;tbOldImgs隱藏文本框中的值在編輯狀態(tài)下才會(huì)得到,其中保存了用戶上一次所上傳文件的信息,存儲(chǔ)格式與tbImgs相同。
7. 在編輯狀態(tài)下,在服務(wù)端向saveshoutoutimgs標(biāo)簽添加與addImg腳本函數(shù)所生成的動(dòng)態(tài)DOM相同的標(biāo)簽,并同時(shí)往tbOldImgs隱藏文本框中寫入文件信息。我在這里寫了一個(gè)示例,讀者可以自己完善代碼用以驗(yàn)證。在顯示文件時(shí)我在文件的名稱上添加了一個(gè)鏈接,這個(gè)鏈接所指向的頁(yè)面用于輸出圖片,如通過得到的圖片ID在數(shù)據(jù)庫(kù)中檢索圖片的二進(jìn)制數(shù)據(jù)然后Write到頁(yè)面上。ImageEntity為自定義Image對(duì)象的實(shí)體類,用以存儲(chǔ)圖片文件的相關(guān)信息。
|
以下為引用的內(nèi)容: public void SetImages(List<ImageEntity> images)
public class ImageEntity
{ public ImageEntity() { } public ImageEntity(int id, string title, Byte[] imageBlob, string type) { ID = id; Title = title; ImageBlob = imageBlob; Type = type; } public int ID { get; set; } public string Title { get; set; } public string Type { get; set; } public Byte[] ImageBlob { get; set; } } |
有一個(gè)問題需要注意,當(dāng)保存編輯狀態(tài)下的數(shù)據(jù)時(shí),在服務(wù)端需要重新刪除原有圖片然后再重新添加圖片,對(duì)于用戶未在客戶端修改的圖片,則需要在保存數(shù)據(jù)前通過tbOldImgs隱藏域中的相關(guān)信息重新檢索得到圖片數(shù)據(jù),然后重新保存圖片。例如編輯狀態(tài)下得到A、B、C三張圖片,用戶刪除了圖片C,添加了圖片D,則保存時(shí)在服務(wù)端這樣操作:先通過tbOldImgs隱藏域得到剩余的舊圖片信息(即圖片A和圖片B),從數(shù)據(jù)庫(kù)中檢索出這些圖片的數(shù)據(jù),保存前先刪除與該條數(shù)據(jù)相關(guān)的所有已上傳圖片,然后與得到的新圖片(即圖片D)一并存入數(shù)據(jù)庫(kù)中。
還有一點(diǎn)就是,如果想要實(shí)現(xiàn)上傳圖片前判斷圖片文件的大小,必須通過C#代碼來實(shí)現(xiàn),這個(gè)不能簡(jiǎn)單地通過js腳本來實(shí)現(xiàn),因?yàn)樯婕暗綖g覽器對(duì)客戶端文件訪問權(quán)限的限制。也就是說,需要將頁(yè)面預(yù)先提交到服務(wù)器,判斷完成后通知客戶端接下來的行為,為了避免頁(yè)面提交時(shí)客戶端原有的狀態(tài)丟失,可以采用隱藏iFrame的方式提交頁(yè)面,這個(gè)在文章的一開始我已經(jīng)提到過了。
總之,在Web中實(shí)現(xiàn)多附件上傳必須借助于javascript來動(dòng)態(tài)創(chuàng)建DOM,編輯狀態(tài)下可以在服務(wù)端將事先處理好的DOM添加到頁(yè)面上,并同時(shí)附件腳本事件,在服務(wù)端代碼和客戶端代碼之間注意保存各個(gè)控件的狀態(tài)。
分享:如何實(shí)現(xiàn)C#中用鼠標(biāo)移動(dòng)頁(yè)面的功能項(xiàng)目中需要實(shí)現(xiàn)以下功能: 打印預(yù)覽控件中,可以用鼠標(biāo)拖動(dòng)頁(yè)面,以查看超出顯示范圍之外的部分內(nèi)容。 該功能本來可以通過拉動(dòng)水平和垂直滾動(dòng)條來實(shí)現(xiàn),但實(shí)際使用中,用戶更趨向于直接用鼠標(biāo)拖動(dòng)頁(yè)面來實(shí)現(xiàn),很多看圖類軟件都有這種類似的功能。而.net的打
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無(wú)刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(kù)(連接字符串的配置及獲取)
- asp.net頁(yè)面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過程實(shí)現(xiàn)分頁(yè)示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- asp.net中“從客戶端中檢測(cè)到有潛在危險(xiǎn)的Request.Form值”的錯(cuò)誤
- 教你在asp.net中動(dòng)態(tài)變更CSS
- 解讀.NET中*延遲*特性的幾個(gè)陷阱
- 解讀在Visual C# .NET中跟蹤和調(diào)試
- ASP.NET 2.0高級(jí)數(shù)據(jù)處理之?dāng)?shù)據(jù)綁定
- 為GridView新增記錄的功能
- ASP.NET MVC是怎樣實(shí)現(xiàn)自己的視圖引擎的
- ASP.NET26個(gè)常用性能優(yōu)化方
- 校內(nèi)網(wǎng)API的.net版本XiaoNei.Net 1.0(非官方)
- ASP.NET 2.0實(shí)現(xiàn)防止同一用戶同時(shí)登陸
- 相關(guān)鏈接:
- 教程說明:
.Net教程-談ASP.NET多附件上傳和附件編輯的實(shí)現(xiàn)
。
.legal signoff text to be defined.