MVC 上傳下載檔案
阿新 • • 發佈:2020-07-29
首先,需要引用DBHelper輔助類,便於實現SQL語句的增刪改差以及連線到資料庫。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; using System.Data; using System.Reflection; using System.Net; using System.Net.Sockets; namespace MVC.Controllers { public class DBHelper { private SqlConnection conn = null; /// <summary> /// 建構函式 /// </summary> public DBHelper() { if (conn == null) { conn = new SqlConnection("這邊是一個數據庫連線字串"); } } /// <summary> /// 返回DataTable查詢結果 /// </summary> /// <param name="sql"></param> /// <param name="par"></param> /// <returns></returns> public DataTable GetTable(string sql, SqlParameter[] par = null) { try { SqlCommand com = new SqlCommand(sql, conn); if (par != null) { com.Parameters.AddRange(par); } SqlDataAdapter ada = new SqlDataAdapter(com); DataTable dt = new DataTable(); ada.Fill(dt); ada.Dispose(); if (conn.State == ConnectionState.Open) { this.Close(); } return dt; } catch (Exception ex) { if (conn.State == ConnectionState.Open) { this.Close(); } throw; } } /// <summary> /// 返回List查詢結果 /// </summary> /// <param name="sql"></param> /// <param name="par"></param> /// <returns></returns> public List<T> GetToList<T>(string sql, SqlParameter[] par = null) { List<T> li = DataTableToList<T>(GetTable(sql)); return li; } /// <summary> /// 返回查詢結果首行首列 /// </summary> /// <param name="sql"></param> /// <param name="par"></param> /// <returns></returns> public object ExecuteScalar(string sql, SqlParameter[] par = null) { try { this.Open(); SqlCommand com = new SqlCommand(sql, conn); if (par != null) { com.Parameters.AddRange(par); } return com.ExecuteScalar(); } catch (Exception ex) { this.Close(); throw; } } /// <summary> /// 返回執行結果受影響行數 /// </summary> /// <param name="sql"></param> /// <param name="par"></param> /// <returns></returns> public int ExecuteNonQuery(string sql, SqlParameter[] par = null) { try { this.Open(); SqlCommand com = new SqlCommand(sql,conn); if (par != null) { com.Parameters.AddRange(par); } return com.ExecuteNonQuery(); } catch (Exception ex) { this.Close(); throw; } } /// <summary> /// Table轉list集合 /// </summary> /// <param name="dt"></param> /// <returns></returns> private static List<T> DataTableToList<T>(DataTable dt) { //初始化值 List<T> result = new List<T>(); for (int i = 0; i < dt.Rows.Count; i++) { T _t = (T)Activator.CreateInstance(typeof(T)); PropertyInfo[] propertys = _t.GetType().GetProperties(); foreach (PropertyInfo pro in propertys) { for (int j = 0; j < dt.Columns.Count; j++) { if (pro.Name.Equals(dt.Columns[j].ColumnName)) { if (dt.Rows[i][j] != DBNull.Value) { pro.SetValue(_t, dt.Rows[i][j], null); } else { pro.SetValue(_t, null, null); } break; } } } result.Add(_t); } return result; } /// <summary> /// 開啟資料庫連結 /// </summary> private void Open() { if (conn.State != ConnectionState.Open) { conn.Open(); } } /// <summary> /// 關閉資料庫連結 /// </summary> private void Close() { if (conn.State != ConnectionState.Closed) { conn.Dispose(); } } } }
其次,控制器。
在次不在多說,程式碼都有註釋。
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; using System.Web.Mvc; using MVC.Models; namespace MVC.Controllers { public class FilterController : Controller { //==========================================================物理路徑上傳和下載======================================================== //例項化DBHelper DBHelper db = new DBHelper(); //顯示資料 // GET: Filter public ActionResult Index() { string sql = $"select * from WenJian"; var list=db.GetToList<WenJian>(sql); return View(list); } //上傳檔案1 [HttpPost] public void Upload1() { //獲取要上傳的檔名稱及型別 var fils = HttpContext.Request.Files[0]; //檔名稱分割成 名稱和型別 var temp = fils.FileName.Split('.'); //獲取物理路徑 檔名稱 var fname = fils.FileName; //獲取型別 var extendName = temp[temp.Length - 1]; //設定儲存路徑 var path = HttpContext.Server.MapPath("~/Filters/"); //如果沒有此路徑 if(!Directory.Exists(path)) { //建立路徑 Directory.CreateDirectory(path); } //獲取到時間格式的名稱 var name = DateTime.Now.ToFileTime() +"."+ extendName; fils.SaveAs(Path.Combine(path,name)); //新增到資料庫 string sql = $"insert into WenJian values('{fname}','{path+name}')"; //返回結果 var result=db.ExecuteNonQuery(sql); if(result>0) { Response.Write("<script>alert('上傳成功');location.href='/Filter/index'</script>"); } else { Response.Write("<script>alert('上傳失敗');location.href='/Filter/index'</script>"); } } //下載檔案1 [HttpGet] public FileStreamResult DownLoad1(string FileName) { ////由虛擬路徑轉換為物理路徑 //string filePath = Server.MapPath(string.Format("~/{0}/{1}", "Filters",FileName)); FileStream fs = new FileStream(FileName, FileMode.Open); return File(fs, "text/plain", FileName); } } }
最後,前臺頁面
@model IEnumerable<MVC.Models.WenJian> @{ ViewBag.Title = "Index"; } <h2>上傳檔案和下載檔案</h2> @*==========================================================物理路徑上傳和下載========================================================*@ <h4>物理路徑上傳和下載</h4> <form action="/Filter/Upload1" method="post" enctype="multipart/form-data" class="table-bordered"> <input type="file" name="fils" /> <input type="submit" value="上傳檔案" /> </form> <form action="/Filter/DownLoad1" method="get" enctype="multipart/form-data" class="table-bordered"> <table class="table table-bordered" style="text-align:center;border:1px solid red"> <tr> <td>編號</td> <td>原檔名稱</td> <td>下載</td> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(m => item.Id) </td> <td> @Html.DisplayFor(m => item.Name) </td> <td> <a href="@Url.Action("DownLoad1","Filter",new { FileName=item.Paths})">下載</a> </td> </tr> } </table> </form> @*==========================================================以上是物理路徑上傳和下載========================================================*@ <br />