ASP.NET 文件上傳的實現(Upload)

来源:http://www.cnblogs.com/weixiaowei/archive/2016/10/31/6016657.html
-Advertisement-
Play Games

1、最近應項目開發的需求要實現附件的非同步上傳和下載。 2、上傳:文件上傳到指定的路徑下,並返回上傳文件的信息給前端界面,如:文件的圖標、上傳的文件名、文件的大小。 3、上傳後,在前端界面上顯示上傳的文件信息,點擊文件名實現將上傳的文件下載到本地。 4、先展示一下Demo運行的效果圖: 點擊提交後: ...


1、最近應項目開發的需求要實現附件的非同步上傳和下載。

2、上傳:文件上傳到指定的路徑下,並返回上傳文件的信息給前端界面,如:文件的圖標、上傳的文件名、文件的大小。

3、上傳後,在前端界面上顯示上傳的文件信息,點擊文件名實現將上傳的文件下載到本地。

4、先展示一下Demo運行的效果圖:

點擊提交後:

點擊文件名實現下載到本地:

5、下麵就給出前臺代碼:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Ajax Form - jQuery EasyUI Demo</title>
    <link rel="stylesheet" type="text/css" href="http://www.jeasyui.com/easyui/themes/default/easyui.css">
    <link rel="stylesheet" type="text/css" href="http://www.jeasyui.com/easyui/themes/icon.css">
    <link rel="stylesheet" type="text/css" href="http://www.jeasyui.com/easyui/demo/demo.css">
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script>
    <script type="text/javascript" src="http://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
</head>
<body>
    <h2>Ajax Form Demo</h2>
    <div class="demo-info" style="margin-bottom:10px">
        <div class="demo-tip icon-tip">&nbsp;</div>
        <div>Type in input box and submit the form.</div>
    </div>

    <div class="easyui-panel" title="Ajax Form" style="width:300px;padding:10px;">
        <form id="ff" action="api/Loding" method="post" enctype="multipart/form-data">
            <table>
                <tr>
                    <td>Name:</td>
                    <td><input name="name" class="f1 easyui-textbox"></input></td>
                </tr>
                <tr>
                    <td>Email:</td>
                    <td><input name="email" class="f1 easyui-textbox"></input></td>
                </tr>
                <tr>
                    <td>Phone:</td>
                    <td><input name="phone" class="f1 easyui-textbox"></input></td>
                </tr>
                <tr>
                    <td>File:</td>
                    <td><input name="file" class="f1 easyui-filebox"></input></td>
                </tr>
                <tr>
                    <td></td>
                    <td><input type="submit" value="提交"></input></td>
                </tr>
            </table>
            <input type="text" value="LodingTable" name="tableName" hidden="hidden" />
        </form>
    </div>
    <div>
        <img id="img" src="" width="20" height="20" />
        <a id="downLoad" downloadid="0" href="#"></a>
        <label>文件大小:</label>
        <label class="size"></label><button id="delete">刪除</button>
        <button id="loding">導入1</button>
    </div>
    <style scoped>
        .f1 {
            width: 200px;
        }
    </style>
    <script type="text/javascript">
        $(function () {
            $("#loding").hide();
            $("#delete").hide().click(function () {
                alert("刪除文件");
            });
            $("#loding").click(function () {
                var tUrl = '/api/Loding/Get';
                //var tJsonStr = '{"idInventoryPrice":"4","withdrawDetails":[{"cInvCode":"800487","cInvCodeSub":"00","iConverDiscount":"0","iUnitPrice":"9.9","iSalePrice":"9.9"},{"cInvCode":"800689","cInvCodeSub":"00","iConverDiscount":"0","iUnitPrice":"6.5","iSalePrice":"5.9"}]}';
                $.ajax({
                    type: "Get",
                    url: tUrl,
                    dataType: "json",
                    async: false,
                    success: function (data) {
                        alert(JSON.stringify(data));
                    }
                });
            });
            $('#ff').form({
                success: function (data) {
                    var json = JSON.parse(data);
                    if (json.result == 1) {
                        $("#delete").show();
                        $("#img").attr("src", json.details[0].AttachmentNameTypeICO);
                        $("#downLoad").attr("downloadid", json.details[0].ID);                        $("#downLoad").html(json.details[0].AttachmentName);
                        $(".size").html(json.details[0].AttachSize + "KB");
                        var tUrl = 'http://localhost:11703/api/Loding/DownLoad?ID=' + $("#downLoad").attr("downloadid");
                        $("#downLoad").attr("href", tUrl);
                    }
                    else {
                        alert(json.resultdetail);
                    }
                }
            });
        });
    </script>
</body>
</html>
View Code

6、後臺上傳代碼:

 NameValueCollection nvf = HttpContext.Current.Request.Form;
            if (!Request.Content.IsMimeMultipartContent())
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }
            string tempPath = "/Upload/" + DateTime.Now.ToString("yyyy-MM-dd/");
            string fileSaveLocation = HttpContext.Current.Server.MapPath("~" + tempPath);//附件的保存地址
            Dictionary<string, object> dic = new Dictionary<string, object>();
            if (!Directory.Exists(fileSaveLocation))
            {
                Directory.CreateDirectory(fileSaveLocation);
            }
            CustomMultipartFormDataStreamProvider provider = new CustomMultipartFormDataStreamProvider(fileSaveLocation);
            try
            {
                var result = await Request.Content.ReadAsMultipartAsync(provider).ContinueWith<Dictionary<string, object>>(x =>
                {
                    var file = provider.FileData[0];
                    FileInfo fileinfo = new FileInfo(file.LocalFileName);
                    if (fileinfo.Length <= 0)
                    {
                        dic.Add("result", -1);
                        dic.Add("resultdetail", "未上傳文件");
                    }
                    else
                    {
                        double? filelength = fileinfo.Length / 1024.0;
                        if (filelength > 10 * 1024)
                        {
                            dic.Add("result", -1);
                            dic.Add("resultdetail", "上傳文件不能大於10M");
                        }
                        else
                        {
                            string saveFileName = Guid.NewGuid().ToString() + fileinfo.Extension;
                            fileinfo.CopyTo(Path.Combine(fileSaveLocation, saveFileName), true);
                            fileinfo.Delete();
                            dic.Add("result", 1);
                            dic.Add("resultdetail", "上傳成功");
                            dic.Add("realPath", file.LocalFileName);//附件保存的絕對路徑
                            dic.Add("attachmentType", fileinfo.Extension);//附件類型
                            dic.Add("attachmentName", Path.GetFileName(file.LocalFileName));//上傳的附件名
                            dic.Add("attachSize", Convert.ToInt32(filelength));//附件大小KB
                            dic.Add("aealPath", tempPath + saveFileName);//附件保存相對路徑
                        }
                    }
                    return dic;
                }, TaskScheduler.FromCurrentSynchronizationContext());
            }
            catch (Exception ex)
            {
                return HandleJson.ToJson(ex.ToString(), false);
            }
            var isSuccess = dic["result"].TryToInt() == 1;
            var msg = dic["resultdetail"].TryToString();//返回上傳信息
            var realPath = string.Empty;//附件保存的絕對路徑
            var relativePath = string.Empty;//返回相對路徑
            var AttachSize = 0;//文件大小kB
            var AttachmentType = string.Empty;//文件擴展名
            var AttachmentName = string.Empty;//原文件名
            if (isSuccess)
            {
                realPath = dic["realPath"].TryToString();
                relativePath = dic["aealPath"].TryToString();
                AttachSize = dic["attachSize"].TryToInt();
                AttachmentType = dic["attachmentType"].TryToString();
                AttachmentName = dic["attachmentName"].TryToString();
            }

            StringBuilder sql = new StringBuilder();
            if (isSuccess)
            {
                try
                {
                    #region 獲取圖標路徑

                    var ICOPath = string.Empty;
                    sql.Append(@"SELECT * FROM dbo.AttachmentType(NOLOCK) WHERE AttachmentType=@AttachmentType");
                    var ICOTable = Common.HandleSQL.GetData(sql.ToString(), null, new SqlParameter[] { new SqlParameter("@AttachmentType", AttachmentType) });
                    if (ICOTable.Rows.Count <= 0)
                    {
                        ICOPath = "";
                    }
                    else
                    {
                        ICOPath = ICOTable.Rows[0]["AttachmentNameTypeICO"].ToString();
                    }

                    #endregion 獲取圖標路徑

                    #region 保存上傳記錄

                    sql.Clear();
                    sql.Append(@"DECLARE @ID INT
SELECT @ID=MAX(ID)+1 FROM dbo.Attachment(NOLOCK)
IF(@ID IS NULL)
BEGIN
SET @ID=1
END
INSERT INTO dbo.Attachment
        ( ID ,
          AttachmentName ,
          AttachmentType ,
          RealPath ,
          AttachSize ,
          UpLoadDate ,
          UpLoadPerson ,
          UpLoadIPAddress
        )
VALUES  ( @ID , -- ID - int
          @AttachmentName , -- AttachmentName - nvarchar(max)
          @AttachmentType , -- AttachmentType - nvarchar(50)
          @RealPath , -- RealPath - nvarchar(max)
          @AttachSize , -- AttachSize - bigint
          GETDATE() , -- UpLoadDate - datetime
          @UpLoadPerson , -- UpLoadPerson - nvarchar(50)
          @UpLoadIPAddress  -- UpLoadIPAddress - varchar(50)
        )
SELECT * FROM dbo.Attachment(NOLOCK) WHERE ID=@ID;
");
                    SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@AttachmentName", AttachmentName),
                    new SqlParameter("@AttachSize", AttachSize), new SqlParameter("@RealPath", relativePath),
                    new SqlParameter("@AttachmentType", AttachmentType),new SqlParameter("@UpLoadPerson","魏小偉"),new SqlParameter("@UpLoadIPAddress",HandleLog.getIPAddress()) };
                    var insert = GetData(sql.ToString(), null, paras);
                    insert.Columns.Add("AttachmentNameTypeICO", typeof(string));
                    insert.Rows[0]["AttachmentNameTypeICO"] = ICOPath;
                    int ID = Convert.ToInt32(insert.Rows[0]["ID"].ToString());//上傳附件的ID
                    return HandleJson.ToJson(insert, 0);

                    #endregion 保存上傳記錄
                }
                catch (Exception ex)
                {
                    if (System.IO.File.Exists(realPath))
                    {
                        File.Delete(realPath);
                    }
                    return HandleJson.ToJson(ex.ToString(), false);
                }
            }
            else
            {
                return HandleJson.ToJson(msg, false);
            }

7、下載代碼:

        [HttpGet, Route("api/Loding/DownLoad")]
        public HttpResponseMessage DownLoad()
        {
            #region 獲取界面參數

            NameValueCollection nvc = HttpContext.Current.Request.QueryString;
            int ID = nvc["ID"].TryToInt();
            if (ID <= 0)
            {
                return HandleJson.ToJson("傳入參數錯誤", false);
            }

            #endregion 獲取界面參數

            #region SQL

            StringBuilder sql = new StringBuilder();
            sql.Append(@"SELECT * FROM dbo.Attachment(NOLOCK) WHERE ID=@ID ");

            #endregion SQL

            #region 執行SQL

            var dt = HandleSQL.GetData(sql.ToString(), null, new SqlParameter[] { new SqlParameter("@ID", ID) });
            if (dt.Rows.Count <= 0)
            {
                return HandleJson.ToJson("未找到下載文件", false);
            }
            var filePath = HttpContext.Current.Server.MapPath("~" + dt.Rows[0]["RealPath"].TryToString());//下載文件的絕對路徑
            string fileName = dt.Rows[0]["AttachmentName"].TryToString();//下載的文件名

            #endregion 執行SQL

            #region 下載文件並添加下載記錄

            try
            {
                //var FilePath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/download/" + fileName);
                var stream = new FileStream(filePath, FileMode.Open);
                HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
                response.Content = new StreamContent(stream);
                response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
                response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                {
                    FileName = fileName
                };

                #region 添加下載記錄

                sql.Clear();
                SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@ID", ID), new SqlParameter("@DownLoadPerson", "魏小偉"), new SqlParameter("@DownLoadIP", HandleLog.getIPAddress()) };
                sql.Append(@"DECLARE @AutoID INT
SELECT @AutoID=MAX(AutoID)+1 FROM dbo.AttachmentDowLoadLog(NOLOCK)
IF(@AutoID IS NULL)
BEGIN
SET @AutoID=1
END
INSERT INTO dbo.AttachmentDowLoadLog
        ( AutoID ,
          ID ,
          DownLoadPerson ,
          DownLoadDate ,
          DownLoadIP
        )
VALUES  ( @AutoID , -- AutoID - int
          @ID , -- ID - int
          @DownLoadPerson , -- DownLoadPerson - nvarchar(max)
          GETDATE() , -- DownLoadDate - datetime
          @DownLoadIP  -- DownLoadIP - nvarchar(50)
        );");
                execSQL(sql.ToString(), null, paras);

                #endregion 添加下載記錄

                return response;
            }
            catch
            {
                return new HttpResponseMessage(HttpStatusCode.NoContent);
            }

            #endregion 下載文件並添加下載記錄
        }
View Code

8、提供一個源碼的小Demo

9、以上只是我個人的一個小Demo,有不對或需要改進的地方還請大家多多提點!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 運行編譯後的程式報錯 error while loading shared libraries: lib*.so: cannot open shared object file: No such file or directory 首先說明一下,這個題目有點長,但是卻很好地反應了遇到的問題點。 在《 ...
  • Visual Studio 內置 Strong Name Tool, 我們直接運行“VS開發人員命令提示”就可以生成秘鑰文件。 秘鑰文件包含公鑰和私鑰。 來看這個例子: 在文件夾下 D:\friend assembly\friend signed 新建一個秘鑰文件。 1. 運行“VS開發人員命令提示 ...
  • using System; using System.Collections.Generic; using System.Linq; using System.Text; region 概述 //在類聲明中使用sealed可防止其它類繼承此類;在方法聲明中使用sealed修飾符可防止擴充類重寫此方法 ...
  • MacBook Pro 只有四個 USB Type C 介面是否錯了? 一項新技術的誕生總會對已存在的事物造成衝擊或影響,如果大家都害怕衝擊與影響,那這個世界永遠像現在不變就行了,大家都好好的,待在自己的舒適區,社會絲毫沒有創新與進步而言。 其實, USB Type C 介面協議在三年前幾個科技巨頭 ...
  • 文檔目錄 本節內容: 簡介 創建嵌入的文件 暴露嵌入的文件 使用嵌入的文件 簡介 一個web應用里,客戶端包含javascript,css,xml等文件,這此文件被添加到一個web項目後,發佈成獨立的文件,有時,我們需要把一些這樣的文件打包入一個程式集(一個類庫項目,一個Dll文件),並且作為嵌入式 ...
  • 文檔目錄 本節內容: 簡介 啟用錯誤處理 非AJAX請求 顯示異常 UserFriendlyException Error 模型 AJAX 請求 異常事件 顯示異常 UserFriendlyException Error 模型 簡介 這個文檔針對Asp.net Mvc和Web Api,如果你對Asp ...
  • 首先,按照慣例,界面預覽: 播放視頻中: 播放音樂中: 功能介紹:打開文件夾,添加音樂或視頻,還有列表顯示,上一曲和下一曲的功能。 解碼是因為我套了WMP,所以沒有解碼的組件。 製作過程: 1)工具箱里添加控制項windows media player。 2)打開功能 3)退出: 4)列表:我查了一些 ...
  • 上節,我們說明瞭封裝分散式緩存的介面、配置以及在startup中的註冊方式。下麵的,我們具體介紹下,分散式緩存的具體實現。 第一個實現,將本地緩存作為分散式緩存,主要用於沒有分散式緩存的情況,這樣就可以不修改程式的情況下直接使用本地緩存。 第二個實現,使用redis作為分散式緩存。 如果想使用Mem ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...