1. 程式人生 > 實用技巧 >MVC 上傳下載檔案

MVC 上傳下載檔案

首先,需要引用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 />