已經很久沒用javascript做頁面了,這天突然有朋友問我關於FileUpload的賦值問題,由於FileUpload經過編譯後,最後產生<input type="file"/>標籤。而在 HTML 文檔中 ,<input type="file"/>
標籤是瀏覽器向伺服器發送選中檔案的。該元素有一個 value
屬性,儲存了使用者指定的檔案的名稱,為安全起見,file標籤的value 屬性是唯讀,不允許程式員修改它的值,並且HTML value
屬性也會被忽略。所以,當資料庫記錄下檔案在用戶端的地址,需要為file標籤的value屬性賦值時,就會出現問題。
經過多翻查詢,最後在下決定使用“隱藏標籤”的方法來實現這些功能。首先在頁面添加一個text標籤,一個button標籤,一個file標籤,並把file標籤的sytle屬性設定為“visibility:hidden;” 把text標籤和button標籤類比file的外觀。在window.onload事件中,把已有的檔案路徑顯示在text標籤上。然後在button標籤的onclick方法中引發file標籤的click事件,擷取上傳檔案,最後把上傳檔案的路徑顯示在text標籤之上。
<html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title></title> <script type="text/javascript"> window.onload = function () { //為text標籤賦值顯示已經有的檔案路徑 document.getElementById("text1").value = "F://My Documents/File.txt"; } function btn1_onclick() { var file = document.getElementById('file1') file.click(); document.getElementById("text1").value = file.value;//顯示新檔案路徑 ....... } </script></head><body> <form id="form1" runat="server"> <div> <input type="text" id="text1" /> <input type="button" id="btn1" onclick="btn1_onclick()" style="width:60px" value="瀏覽" /> <input type="file" id="file1" style="visibility:hidden;" /> </div> </form></body></html>
但要注意的一點是,使用以上方法,只適用於為file標籤的name屬性賦值,但無法直接擷取file的上傳檔案。這是因為安全性的原因,瀏覽器會阻止直接通過程式對file標籤綁定上傳檔案。如果想通過“隱藏標籤”的方式直接上傳檔案,那還得花一點小工夫。首先建立一個file標籤,然後加入一個text標籤把file的文本部分覆蓋,最後在file的onchange事件中為text標籤賦值。
<html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title></title> <script type="text/javascript"> window.onload = function () { //為text賦值顯示已經有的檔案路徑 document.getElementById("text1").value = "F://My Documents/File.txt"; } //在file賦值時,讓text標籤同步更新 function file1_onchange() { document.getElementById("text1").value = document.getElementById("file1").value; } </script> <script type="text/C#" runat="server"> //擷取上傳檔案 protected void Page_Load(object sender, EventArgs e) { if (HttpContext.Current.Request.Files.Count != 0) { HttpPostedFile file = HttpContext.Current.Request.Files[0]; string fileName = file.FileName; System.IO.Stream stream=file.InputStream; byte[] byteData = new byte[stream.Length]; int length = stream.Read(byteData, 0, (int)stream.Length); string data = System.Text.Encoding.Default.GetString(byteData); ........... } } </script></head><body> <form id="form1" method="post" enctype="multipart/form-data" action="Default.aspx"> <div style="position:relative;height:24px;"> <!--設定style屬性,使text標籤把file標籤的文本部分覆蓋--> <div style="position:absolute;left:0;top:2px;"> <input type="text" id="text1"/> </div> <input type="file" id="file1" name="file1" onchange="file1_onchange()"/> <input type="submit" /> </div> </form></body></html>