在ASP.Net MVC - 上傳檔案至Web Server上這篇中,
限量在文章的最後提到了使用Ajax傳送檔案的問題,
接著在XMLHttpRequest的基本應用中簡單介紹了XMLHttpRequest的使用方式,
有了XMLHttpRequest這個材料,就可以來調製Ajax傳送檔案的解藥了。
步驟很簡單,
解藥的程式碼組成只要將上述兩篇的程式碼複製貼上融合在一起,
在修改XMLHttpRequest部分的程式碼即可,
在XMLHttpRequest的範例裡,我們沒有傳送任何資料至Server端,
這次需要將Form裡的File檔案傳過去,
簡單來說,
只要在JavaScript程式區段裡產生一個FormData的Instance,
將Form裡input element的值用KeyValuePair的方式塞進FormData Instance裡,
最後再將FormData Instance藉由XMLHttpRequest送出就完成了,
以下為範例的程式碼:
TestFileUpload.cshtml:
HomeController.cs
這邊要注意的是TestFileUpload所帶的參數名稱要和FormData的KeyValuePair的Key名稱相符,否則會抓不到資料。
參考來源:
W3CSchool AJAX - Send a Request To a Server
限量在文章的最後提到了使用Ajax傳送檔案的問題,
接著在XMLHttpRequest的基本應用中簡單介紹了XMLHttpRequest的使用方式,
有了XMLHttpRequest這個材料,就可以來調製Ajax傳送檔案的解藥了。
步驟很簡單,
解藥的程式碼組成只要將上述兩篇的程式碼複製貼上融合在一起,
在修改XMLHttpRequest部分的程式碼即可,
在XMLHttpRequest的範例裡,我們沒有傳送任何資料至Server端,
這次需要將Form裡的File檔案傳過去,
簡單來說,
只要在JavaScript程式區段裡產生一個FormData的Instance,
將Form裡input element的值用KeyValuePair的方式塞進FormData Instance裡,
最後再將FormData Instance藉由XMLHttpRequest送出就完成了,
以下為範例的程式碼:
TestFileUpload.cshtml:
<!DOCTYPE html> <html> <head> <title>TestFileUpload</title> <script> // 產生XMLHttpRequest物件的Function function CreateXMLHttpRequestObject() { try { return new XMLHttpRequest(); } catch (e) { } try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e) { } try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch (e) { } try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { } throw new Error("This browser does not support XMLHttpRequest."); } // 上傳Form資料至Server function UploadForm(form) { // 產生FormData的Instance var fData = new FormData(); // 將form裡的name=file的input element值塞入FormData fData.append( 'file', document.getElementById( 'file' ).files[0] ); // 將form裡的name=test的input element值塞入FormData fData.append( 'test', document.getElementById( 'test' ).value ); var xhr = CreateXMLHttpRequestObject(); xhr.open(form.method, form.action, true); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { alert(xhr.responseText); } }; xhr.send( fData ); } </script> </head> <body> <div> <form action="@Url.Action("TestFileUpload", "Home")" method="post" enctype="multipart/form-data"> <input type="file" name="file" id="file" /><br /> <input type="text" name="test"/> <input type="submit" name="submit" value="Submit" onsubmit="UploadForm(this)" /> </form> </div> </body> </html>
HomeController.cs
[HttpPost] public ActionResult TestFileUpload( HttpPostedFileBase file, String test ) { var path = String.Empty; var uploadDir = Server.MapPath( "~/App_Data/Uploads" ); if ( file != null && file.ContentLength > 0 ) { if ( !Directory.Exists( uploadDir ) ) Directory.CreateDirectory( uploadDir ); path = Path.Combine( uploadDir, file.FileName ); file.SaveAs( path ); } return RedirectToAction( "Index", "Home" ); }
這邊要注意的是TestFileUpload所帶的參數名稱要和FormData的KeyValuePair的Key名稱相符,否則會抓不到資料。
參考來源:
W3CSchool AJAX - Send a Request To a Server
留言
張貼留言