C# FileUpload 使用過程
從控件列表拖出FileUpload控件放在網頁上面,運行網頁,就可以進行文件選擇了,很方便
先說說主要的屬性、方法吧
FileUpload.FileName屬性:該屬性用於獲取客戶端上使用FileUpload控件上的文件的名稱
FileUpload.SaveAs方法:使用FileUpload控件,將上傳文件的內容保存到Web服務器上的制定路徑。其語法如下:
Public void SaveAs(string filename)
參數filename:一個字符串,用於指定服務器上保存上傳文件的位置的完整路徑。
配置文件設定上傳文件大小
有兩種方法:
第一種,你可以寫判斷來決定是否上傳
1 FileUpload1.PostedFile.ContentLength
第二種,你可以更改上傳文件的大小的限制
在web.config中的 <system.web> </system.web內加入如下代碼:
<httpRuntime executionTimeout="600" maxRequestLength="951200" useFullyQualifiedRedirectUrl="true" minFreeThreads="8" />
executionTimeout:表示允許執行請求的最大時間限制,單位為秒
maxRequestLength:指示 ASP.NET 支持的最大文件上載大小。該限制可用於防止因用戶將大量文件傳遞到該服務器而導致的拒絕服務攻擊。指定的大小以 KB 為單位。默認值為 4096 KB (4 MB)。好像最大可以改成2G吧
將一個文件上傳到指定目錄,非常方便,用FileUpload也非常簡單。
可實際情況中,會需要一次性選擇多個文件,上傳多個文件,如果上傳的是圖片,還得增加預覽功能,其次就是一個上傳的進度條問題。
先說說選擇多個文件吧,這是控件的問題,貌似修改不了,沒辦法,只能一次選擇一個。
上傳多個文件:頁面加載時,就加載多個FileUpload控件,如果數目不確定,那就動態創建,然后動態創建過程中呢,並不是純粹的直接構造一個FileUpload添加即可,而是需要走如下流程:1.清空顯示FileUpload的區域。2.加載緩存中的FileUpload控件。3.構造一個新的FileUpload控件並添加到頁面。4.將該區域的FileUpload重新全部儲存在緩存中。
1 /// <summary> 2 /// 添加FileUpload 3 /// </summary> 4 private void AddFileUpload() 5 { 6 // 清除表格原有內容 7 tab_FileUpload_Area.Rows.Clear(); 8 // 加載緩存中的上傳控件 9 GetFileUpload(); 10 // 新增上傳控件 11 InsertFileUploadToTable(new FileUpload()); 12 // 保存當前頁面的上傳控件 13 SetFileUpload(); 14 } 15 16 /// <summary> 17 /// 加載緩存中的FileUpload 18 /// </summary> 19 private void GetFileUpload() 20 { 21 ArrayList arrayList = new ArrayList(); 22 if (Session["FilesControls"] != null) 23 { 24 arrayList = (ArrayList)Session["FilesControls"]; 25 for (int i = 0; i < arrayList.Count; i++) 26 { 27 InsertFileUploadToTable((FileUpload)arrayList[i]); 28 } 29 } 30 } 31 32 /// <summary> 33 /// 保存當前頁面的FileUpload控件 34 /// </summary> 35 private void SetFileUpload() 36 { 37 ArrayList arrayList = new ArrayList(); 38 39 foreach (Control c in tab_FileUpload_Area.Controls) 40 { 41 if (c.GetType().ToString() == "System.Web.UI.HtmlControls.HtmlTableRow") 42 { 43 HtmlTableCell tabCell = (HtmlTableCell)c.Controls[0]; 44 foreach (Control control in tabCell.Controls) 45 { 46 if (control.GetType().ToString() == "System.Web.UI.WebControls.FileUpload") 47 { 48 FileUpload f = (FileUpload)control; 49 arrayList.Add(f); 50 } 51 } 52 } 53 } 54 55 Session["FilesControls"] = arrayList; 56 57 } 58 59 /// <summary> 60 /// 創建FileUpload控件,並添加 61 /// </summary> 62 /// <param name="fileUpload"></param> 63 private void InsertFileUploadToTable(System.Web.UI.WebControls.FileUpload fileUpload) 64 { 65 HtmlTableRow tabRow = new HtmlTableRow(); 66 HtmlTableCell tabCell = new HtmlTableCell(); 67 tabCell.Controls.Add(fileUpload); 68 tabRow.Controls.Add(tabCell); 69 tab_FileUpload_Area.Rows.Add(tabRow); 70 }
這種操作呢,存在一個問題,就是在重新加載FileUpload的時候,會導致原來已經選擇過的,也會被清空,從而需要重新選擇。
針對這種情況,可以結合按鈕進行觸發FileUpload事件觸發,然后label顯示獲取的路徑,至於FileUpload則隱藏掉,后台進行路徑保存,然后再加載,也可以達到效果。
1.頁面增加FileUpload、出發按鈕、顯示路徑的文本
1 <asp:FileUpload ID="fu_serverUpload" runat="server" Style="margin-left: -230px;" onpropertychange="show(this.value)" /> 2 <input id="選擇" type="button" value="選擇圖片文件" onclick="fileClickFun()" /><label id="lbl_showUrl"></label>
2.綁定按鈕的單擊觸發事件
1 function fileClickFun() { 2 document.getElementById("fu_serverUpload").click(); 3 }
3.后台代碼為FileUpload綁定事件
1 protected void Page_Load(object sender, EventArgs e) 2 { 3 this.fu_serverUpload.Attributes.Add("onchange", "label_text();"); 4 }
4.獲取圖片路徑,並在DIV中顯示
1 function label_text() { 2 var file_upl = document.getElementById('fu_serverUpload'); 3 4 file_upl.select(); 5 6 var realpath = document.selection.createRange().text; 7 8 document.getElementById("lbl_showUrl").innerHTML = document.getElementById("fu_serverUpload").value; 9 10 }
在獲取路徑這里呢,又存在一個問題,就是IE6以上的瀏覽器,會啟用上傳的保護機制,用戶選擇文件后,反饋回來的路徑不是原始路徑,而是C:\fakepath\XXXXXX這樣的路徑,當然,這種情況的解決辦法呢,是需要客戶在IE的安全設置里面進行設置,即可獲取完成的路徑。而在網上有網友說可以不設置,就能獲取完整的,我試驗之后,IE6可以,但是IE8、9還得設置之后才能獲取。
設置步驟如下:工具 -> Internet選項 -> 安全 -> 自定義級別 -> 找到“其他”中的“將本地文件上載至服務器時包含本地目錄路徑”,選中“啟用”即可。
在這里另外值得一提的是div顯示圖片,嘎嘎,似乎有防盜功能耶,顯示之后,在網頁上面不能選中,也不能另存,嘎嘎
1 <script type="text/javascript"> 2 function show(upimg) { 3 var dd = document.getElementById("divview"); 4 dd.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = upimg; 5 //dd.style.width = 166; 6 //dd.style.height = 190; 7 8 // 此行代碼的效果是:限制圖片的大小在設定寬度長度范圍內,如果不增加該行代碼,圖片多少像素,則顯示多大的圖片 9 dd.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").sizingMethod = 'scale'; 10 } 11 </script>
1 <div id="divview" style="filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=image); WIDTH: 166px; HEIGHT: 190px"> 2 <!--用於顯示圖片--> 3 </div>
最后附上批量上傳時,后台的處理過程
1 /// <summary> 2 /// 保存圖片到服務器 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 protected void btn_uploadFile_Click(object sender, EventArgs e) 7 { 8 string filePath = Server.MapPath("./") + "Pictures"; 9 10 // 獲取上傳圖片的集合 11 HttpFileCollection hfc = Request.Files; 12 for (int i = 0; i < hfc.Count; i++) 13 { 14 HttpPostedFile uHfc = hfc[i]; 15 if (uHfc.ContentLength > 0) 16 { 17 // 上傳圖片的文件名 18 string fileName = uHfc.FileName; 19 uHfc.SaveAs(filePath + "\\" + System.IO.Path.GetFileName(uHfc.FileName)); 20 21 } 22 } 23 }
以上東西,來自網上各種解答,只是我一次性遇到了這些問題,都在一篇里面搞定。如果還有什么其它問題,歡迎留言