成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ASP.NET多附件上傳和附件編輯的實現

開發 后端
本文將簡單談談ASP.NET多附件上傳和附件編輯的實現。多附件上傳也有用JSP、PHP等其它技術實現的,但基本前提都是事先通過js腳本來動態創建DOM,然后上傳的時候在服務端做一下處理。

在寫這篇文章之前我也在Google上找到了很多有關多附件上傳的文章,有用ASP.NET實現的,也有用JSP、PHP等其它技術實現的,但基本前提都是事先通過js腳本來動態創建DOM,然后上傳的時候在服務端做一下處理,有點類似于163的郵件系統。文件上傳需要通過頁面的POST方法進行提交,這個我在一次MOSS開發中iFrame表單提交的古怪問題解決一問中已經闡述過,其中包括了如何使用頁面隱藏的iFrame來提交表單從而避免整個頁面提交到服務器而導致頁面的刷新。多附件上傳的原理與之類似,只不過需要事先通過腳本在頁面上動態創建多個input type='file'的標簽,當然,如果要想功能更加***,你可能還需要通過腳本動態添加一些按鈕事件以讓用戶可以刪除他所添加的文件。下面是一個應用效果的截圖。 

應用效果的截圖

其中紅色方框內的內容是通過腳本在頁面上動態創建的,將用戶在客戶端所選文件的文件名動態添加到一個div里,同時在這個div中放一個隱藏的input type=’file’的標簽,它的value為用戶所選文件的路徑,然后在div中放置一個img,添加onmouseover和onmouseout事件為圖片增加了一些鼠標滑動時的效果,onclick事件用來響應用戶點擊img時刪除對應的文件。看一下代碼中的具體實現。

代碼建立在Ajax.net基礎之上,環境是Visual Studio 2008 + Windows 2003,測試通過!

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %> 
  2.  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  4. <html xmlns="http://www.w3.org/1999/xhtml"> 
  5. <head runat="server"> 
  6. <title></title> 
  7. <script src="MultiAffix.js" type="text/javascript"></script> 
  8. <script type="text/javascript"> 
  9. var controlName = 1; // This variable is for the dynamic file controls's name.  
  10.  
  11. function addImg(targetElement, savestatsElement, oldimgElement) {  
  12. var browseimgElement = $get("browseimg");  
  13. var arr = browseimgElement.getElementsByTagName('input');  
  14. if (arr.length == 0 || arr[0].value.length == 0) {  
  15.  
  16. alert('No file inputs.');  
  17. return;  
  18. }  
  19. var oldbrowser = arr[0];  
  20. var filename = getfilename(oldbrowser.value);  
  21. if (!validateimgtype(oldbrowser.value)) return;  
  22. if (!validateimgcount(targetElement, 3)) return;  
  23. var imgtitles = savestatsElement.value + oldimgElement.value;  
  24. if (validateimgexist(filename, imgtitles)) { alert('You have already added this image!'); return; }  
  25. if (oldbrowser != undefined) {  
  26. var newbrowser = oldbrowser.cloneNode(true);  
  27. newbrowser.value = '';  
  28. var newfile = document.createElement('div');  
  29. newfile.innerHTML = filename + '&nbsp;&nbsp;';  
  30.  
  31. // Create a button element for delete the image.  
  32. var newfileimgbutton = document.createElement('img');  
  33. newfileimgbutton.src = 'ShoutOut_Close.gif';  
  34. newfileimgbutton.alt = 'Delete';  
  35. newfileimgbutton.onclick = function() {  
  36. this.parentNode.parentNode.removeChild(this.parentNode);  
  37. savestatsElement.value = updatehiddenimgs(filename, savestatsElement.value);  
  38. }  
  39. newfileimgbutton.onmouseover = function() {  
  40. this.src = 'ShoutOut_Close_rollover.gif';  
  41. }  
  42. newfileimgbutton.onmouseout = function() {  
  43. this.src = 'ShoutOut_Close.gif';  
  44. }  
  45.  
  46. browseimgElement.replaceChild(newbrowser, oldbrowser);  
  47. oldbrowser.name = ++controlName;  
  48. oldbrowser.style.display = 'none';  
  49. newfile.appendChild(oldbrowser);  
  50.  
  51. newfile.appendChild(newfileimgbutton);  
  52. targetElement.appendChild(newfile);  
  53.  
  54. $get("chkAgree").checked = false;  
  55. $get("btAdd").disabled = true;  
  56. savestatsElement.value += filename + '|';  
  57. }  
  58. }  
  59. </script> 
  60.  
  61. </head> 
  62. <body> 
  63. <form id="form1" runat="server"> 
  64. <asp:ScriptManager ID="ScriptManager1" runat="server"> 
  65. </asp:ScriptManager> 
  66. <div> 
  67. <div> 
  68. Description:  
  69. <asp:TextBox ID="tbDescription" MaxLength="2000" runat="server" TextMode="MultiLine"></asp:TextBox> 
  70. </div> 
  71. <div> 
  72. Location:  
  73. <asp:DropDownList ID="ddlLocation" runat="server"> 
  74. </asp:DropDownList> 
  75. </div> 
  76. <div> 
  77. Display Posted By User:  
  78. <asp:CheckBox ID="chkPostedByUser" Checked="true" runat="server" /> 
  79. </div> 
  80. <div> 
  81. Notify Shout out User:  
  82. <asp:CheckBox ID="chkNotifyUser" runat="server" /> 
  83. </div> 
  84. <div> 
  85. Notify Shout out to Email:  
  86. <asp:TextBox ID="tbShoutoutToEmail" MaxLength="25" runat="server"></asp:TextBox> 
  87. </div> 
  88. <div> 
  89. Images:  
  90. <div id="saveshoutoutimgs" runat="server"> 
  91. </div> 
  92. <input id="btAddImage" type="button" onclick="$get('saveshoutoutaddimgs').style.display='block';this.disabled=true;" 
  93. value="Click here to Add Image" /> 
  94. </div> 
  95. <div id="saveshoutoutdetailshowimg"> 
  96. <div id="saveshoutoutaddimgs" style="display: none;"> 
  97. <div> 
  98. Add Image:</div> 
  99. <div id="browseimg"> 
  100. <input type="file" /> 
  101. </div> 
  102. <div> 
  103. Size limit of the images is 100kb. Hieght and Width of the images should not exceed  
  104. 200px.</div> 
  105. <div> 
  106. <input id="chkAgree" type="checkbox" onclick="$get('btAdd').disabled=!this.checked;" />I  
  107. agree.legal signoff text to be defined.  
  108. </div> 
  109. <div> 
  110. <input id="btAdd" disabled="disabled" type="button" value="Add" runat="server" /> 
  111. </div> 
  112. </div> 
  113. </div> 
  114. </div> 
  115. <asp:TextBox ID="tbImgs" runat="server" Text="|" Style="display: none;"></asp:TextBox> 
  116. <asp:TextBox ID="tbOldImgs" runat="server" Text="|" Style="display: none;"></asp:TextBox> 
  117. </form> 
  118. </body> 
  119. </html> 
  120. protected void Page_Load(object sender, EventArgs e)  
  121. {  
  122. string script = string.Format("addImg($get('{0}'), $get('{1}'), $get('{2}'));",  
  123. this.saveshoutoutimgs.ClientID,  
  124. this.tbImgs.ClientID,  
  125. this.tbOldImgs.ClientID);  
  126. this.btAdd.Attributes.Add("onclick", script);  

簡單做一下說明:

1. <div id="saveshoutoutimg" runat="server"/>用來存放動態添加的文件相關標簽。

2. btAddImage被點擊后自身將被disabled掉,然后顯示saveshoutoutaddimgs整個div。

3. 在saveshoutoutaddimgs中用戶可以完成文件的選取和確認操作,chkAgree用來enable btAdd按鈕。

4. 當用戶點擊btAdd時,觸發onclick事件,該事件在code-behind的Page_Load方法中注冊,因為腳本中涉及到使用服務端控件的ClientID屬性,這樣寫比較方便。

5. 客戶端函數addImg用來完成動態DOM的添加操作,它接收三個參數,***個參數targetElement表示存放動態DOM的宿主DIV,第二個參數savestatsElement表示用于保存已添加文件信息的隱藏文本框,第三個參數oldimgElement表示用于保存在編輯狀態下用戶上一次上傳的文件信息隱藏文本框。基本思路是復制browseimg下的input type="file"標簽,然后將動態生成的DOM添加到saveshoutoutimgs下,并同時附加了一些事件。

6. tbImgs隱藏文本框用來保存用戶已選文件的信息,以"|文件名1|文件名2|文件名3|..."的格式存放;tbOldImgs隱藏文本框中的值在編輯狀態下才會得到,其中保存了用戶上一次所上傳文件的信息,存儲格式與tbImgs相同。

7. 在編輯狀態下,在服務端向saveshoutoutimgs標簽添加與addImg腳本函數所生成的動態DOM相同的標簽,并同時往tbOldImgs隱藏文本框中寫入文件信息。我在這里寫了一個示例,讀者可以自己完善代碼用以驗證。在顯示文件時我在文件的名稱上添加了一個鏈接,這個鏈接所指向的頁面用于輸出圖片,如通過得到的圖片ID在數據庫中檢索圖片的二進制數據然后Write到頁面上。ImageEntity為自定義Image對象的實體類,用以存儲圖片文件的相關信息。

  1. public void SetImages(List<ImageEntity> images)  
  2. {  
  3. if (images.Count > 0)  
  4. {  
  5. this.tbOldImgs.Text = "|";  
  6. foreach (ImageEntity image in images)  
  7. {  
  8. HtmlGenericControl imgDiv = new HtmlGenericControl("Div");  
  9.  
  10. HtmlAnchor imgAnchor = new HtmlAnchor();  
  11. imgAnchor.HRef = string.Format("Thumbnail.aspx?isthumbnail=false&basecommentid={0}&imagetitle={1}",  
  12. image.ID.ToString(), image.Title);  
  13. imgAnchor.Target = "_blank";  
  14. imgAnchor.Title = image.Title;  
  15. imgAnchor.InnerHtml = image.Title + "&nbsp;&nbsp;";  
  16.  
  17. HtmlImage imgButton = new HtmlImage();  
  18. imgButton.Src = "ShoutOut_Close.gif";  
  19. imgButton.Alt = "Delete";  
  20. imgButton.Attributes["onclick"] = string.Format("this.parentNode.parentNode.removeChild(this.parentNode);$get('{0}').value = updatehiddenimgs('{1}',$get('{0}').value);",  
  21. this.tbOldImgs.ClientID, image.Title);  
  22. imgButton.Attributes["onmouseover"] = "this.src='ShoutOut_Close_rollover.gif'";  
  23. imgButton.Attributes["onmouseout"] = "this.src='ShoutOut_Close.gif'";  
  24.  
  25. imgDiv.Controls.Add(imgAnchor);  
  26. imgDiv.Controls.Add(imgButton);  
  27. this.saveshoutoutimgs.Controls.Add(imgDiv);  
  28. this.tbOldImgs.Text += image.Title + "|";  
  29. }  
  30. }  
  31. }  
  32.    
  33.  
  34. public class ImageEntity  
  35. {  
  36. public ImageEntity()  
  37. {  
  38. }  
  39.  
  40. public ImageEntity(int id, string title, Byte[] imageBlob, string type)  
  41. {  
  42. ID = id;  
  43. Title = title;  
  44. ImageBlob = imageBlob;  
  45. Type = type;  
  46. }  
  47.  
  48. public int ID { get; set; }  
  49. public string Title { get; set; }  
  50. public string Type { get; set; }  
  51. public Byte[] ImageBlob { get; set; }  

有一個問題需要注意,當保存編輯狀態下的數據時,在服務端需要重新刪除原有圖片然后再重新添加圖片,對于用戶未在客戶端修改的圖片,則需要在保存數據前通過tbOldImgs隱藏域中的相關信息重新檢索得到圖片數據,然后重新保存圖片。例如編輯狀態下得到A、B、C三張圖片,用戶刪除了圖片C,添加了圖片D,則保存時在服務端這樣操作:先通過tbOldImgs隱藏域得到剩余的舊圖片信息(即圖片A和圖片B),從數據庫中檢索出這些圖片的數據,保存前先刪除與該條數據相關的所有已上傳圖片,然后與得到的新圖片(即圖片D)一并存入數據庫中。

還有一點就是,如果想要實現上傳圖片前判斷圖片文件的大小,必須通過C#代碼來實現,這個不能簡單地通過js腳本來實現,因為涉及到瀏覽器對客戶端文件訪問權限的限制。也就是說,需要將頁面預先提交到服務器,判斷完成后通知客戶端接下來的行為,為了避免頁面提交時客戶端原有的狀態丟失,可以采用隱藏iFrame的方式提交頁面,這個在文章的一開始我已經提到過了。

總之,在Web中實現多附件上傳必須借助于javascript來動態創建DOM,編輯狀態下可以在服務端將事先處理好的DOM添加到頁面上,并同時附件腳本事件,在服務端代碼和客戶端代碼之間注意保存各個控件的狀態。

【編輯推薦】

  1. 淺談ASP.NET MVC中的FluentHtml與連續接口
  2. ASP.NET中性能和擴展性的秘密
  3. 淺談ASP.NET中ViewState與ViewData的區別
  4. ASP.NET 3.5圖表控件親密接觸
  5. ASP.NET中防止用戶多次登錄的方法
責任編輯:彭凡 來源: cnblogs
相關推薦

2009-07-23 10:37:43

2009-07-29 10:02:49

ASP.NET上傳

2009-07-27 12:22:03

ASP.NET和ASPASP.NET入門教程

2009-07-29 16:08:07

ASP和ASP.NET

2009-07-22 18:03:00

ASP.NET ASP

2009-07-21 15:38:31

2009-07-27 14:46:16

XML和ASP.NET

2009-07-22 17:45:11

ASP.NET插件

2024-05-20 13:06:18

2009-07-20 15:44:32

ASP.NET MVC

2009-07-21 16:23:57

2009-07-31 13:52:26

ASP.NET數據庫圖

2010-07-01 08:49:34

ASP.NET MVC

2009-10-30 14:03:59

ASP.NET上傳文件

2009-07-24 15:07:56

ASP.NET上傳文件

2010-02-05 08:32:32

ASP.NET MVC

2009-07-22 17:45:35

ASP.NET教程

2009-07-21 13:01:07

ASP.NET上傳文件

2009-07-27 17:32:39

Web ServiceASP.NET

2009-07-20 16:09:39

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人欧美日韩一区二区三区 | 午夜一区二区三区在线观看 | 一区二区三区电影在线观看 | 久久亚洲国产精品 | 日韩欧美1区2区 | 精品一区视频 | h视频免费看 | 亚洲精品乱码久久久久久9色 | a在线观看 | 国产一级视频在线播放 | 国产精品99久久久久 | 视频精品一区 | 久久国产秒 | 成人午夜视频在线观看 | 精品一区国产 | 亚洲理论在线观看电影 | 黄色大全免费看 | 免费国产一区二区 | av在线一区二区三区 | 国产精品日日做人人爱 | 中文字幕在线观看第一页 | 欧美综合一区二区 | 成人在线免费观看视频 | 久久99精品久久久久蜜桃tv | 91精品国产色综合久久 | 国产一区二区a | 在线播放第一页 | 91在线免费视频 | 欧美a√ | 国产激情综合五月久久 | 久久久在线视频 | 亚洲精品一区二区三区蜜桃久 | 亚洲午夜网| 午夜网| 7799精品视频天天看 | 免费a国产| 日本一区二区三区在线观看 | 国产精品视频久久久久久 | 国产午夜久久 | 7777在线视频免费播放 | 一区二区在线 |