ASP.NET CORE之上傳文件夾

来源:https://www.cnblogs.com/lyps/archive/2019/01/22/10303662.html
-Advertisement-
Play Games

最近閑餘時間在做一個仿百度網盤的項目,其中就有一個上傳文件夾的功能。查了下網上好像對這個問題的描述比較少,所以在此記錄一下。 1、網上找來找去發現webkitdirectory這個東西,H5的一個新的屬性吧,就是在文件控制項上標記這個屬性可以獲取到選擇文件夾里的所有文件的。 特地看了下百度網盤網頁版也 ...


最近閑餘時間在做一個仿百度網盤的項目,其中就有一個上傳文件夾的功能。查了下網上好像對這個問題的描述比較少,所以在此記錄一下。

1、網上找來找去發現webkitdirectory這個東西,H5的一個新的屬性吧,就是在文件控制項上標記這個屬性可以獲取到選擇文件夾里的所有文件的。

<input type="file" name="file" webkitdirectory>

特地看了下百度網盤網頁版也是使用的這個屬性,但是網上都說該屬性只有chrome瀏覽器支持。然後我就不信,用360瀏覽器試了試還是可以用。結果發現360有兩種模式(極速模式和相容模式),極速模式是以Blink(Webkit)為內核的瀏覽模式,而chrome好像也是使用的這個內核。所以說我剛剛試的也可以用,但是切換到相容模式則不能用了(IE內核)。

2、言歸正傳,直接貼代碼吧。

<input type="file" name="file" webkitdirectory>
    <button id="upload" type="button" onclick="Upload()" >上傳</button>
var files = [];
        $(document).ready(function () {
            $('input').change(function () {
                files = this.files;
            })
        });

        function Upload() {
            var data = new FormData();
            debugger
            for (var i = 0; i < files.length; i++) {
                data.append('file', files[i]);
            }
            var path = files[0].webkitRelativePath;
            $.ajax({
                type: "post",
                url: "/home/UpLoad",
                data: data,
                contentType: false,
                processData: false,
                success: function (data) {
                    console.log(data);
                }
            })
        }

最後是控制器

[HttpPost]
        public IActionResult UpLoad()
        {
            var files = Request.Form.Files;
            string rootpath = _hostingEnvironment.WebRootPath + @"\Files";

            try
            {
                foreach (var file in files)
                {
                    string[] arrpath = file.FileName.Split(@"/");
                    string dirpath = "";//該文件的所在目錄(包括一、二級目錄)
                    string filename = arrpath[arrpath.Length - 1].ToString();//該文件名
                    for (int i=0;i<arrpath.Length;i++)
                    {
                        if(i==arrpath.Length-1)
                        {
                            break;
                        }
                        dirpath += arrpath[i]+@"/";
                    }
                    DicCreate(Path.Combine(rootpath, dirpath));//不存在則創建該目錄

                    
                    string filepath = Path.Combine(rootpath, file.FileName);
                    using (var addFile = new FileStream(filepath, FileMode.OpenOrCreate))
                    {
                        if (file != null)
                        {
                            file.CopyTo(addFile);
                        }
                        else
                        {
                            Request.Body.CopyTo(addFile);
                        }
                        addFile.Close();
                    }
                }

                return Ok(new
                {
                    success = true,
                    message = "上傳成功"
                });
            }
            catch(Exception ex)
            {
                return Ok(new
                {
                    success = false,
                    message = ex.Message
                });
            }
        }

        /// <summary>
        /// 文件目錄如果不存在,就創建一個新的目錄
        /// </summary>
        /// <param name="path"></param>
        private void DicCreate(string path)
        {
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
        }

3、說明下,後端接收到的files是選擇文件夾里所有文件的集合。

比如我這裡測試使用的是選中一個名為新建文件夾的文件夾,然後該文件夾里有兩張圖片和一個子文件夾,子文件夾里也是一張圖片。

所有我獲取到的files是count為3的集合,文件名分別為 新建文件夾/1.jpg、新建文件夾/2.jpg、新建文件夾/新建文件夾/8.jpg(這個是在二級文件夾里的)。

大概的思路就是:獲取到文件集合後遍歷,然後取得該文件所在的文件夾,如果伺服器上不存在該文件夾則創建,最後上傳文件。

當然我代碼只是寫了最基本的實現,具體還有些驗證或者業務邏輯還得具體分析。

然後其他就不多說了吧,不太明白的調試下代碼差不多就懂了,如有錯誤,望指出。


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

-Advertisement-
Play Games
更多相關文章
  • FileUpload在HTML中是個常用的基礎控制項,在涉及到上傳各種格式的文件時候都會用到;筆者前段時間正好用到它做上傳功能,記錄下來做一些累積, 前端到後臺用的是的Jquery中的Ajax進行數據傳輸,在後臺的邏輯處理中以HttpPostedFileBase的對象調用SaveAs(ServerSa ...
  • C# 實體類轉json數據過濾掉欄位為null的欄位 語法如下: var jsonSetting = new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore}; var json = JsonConvert.S ...
  • 上一篇我們用jenkins做了一個簡單的自動化發佈,在shell中採用的是 BUILD_ID=dontKillMe nohup dotnet xxx.dll & 這種簡單的後臺承載,如果你的業務 量相對比較小,可以用這個方法玩一玩,但存在二個問題:1. 無法對進程進行批量或者可視化管理。 2. 單機 ...
  • 1、新建ASP.NET Core Web應用程式 2、從NuGet下載安裝以下工具包 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.SqlServer Microsoft.EntityFrameworkCore.Tools M ...
  • 在講一致性Hash之前我們先來討論一個問題。 問題:現在有億級用戶,每日產生千萬級訂單,如何將訂單進行分片分表? 小A:我們可以按照手機號的尾數進行分片,同一個尾數的手機號寫入同一片/同一表中。 大佬:我希望通過會員ID來查詢這個會員的所有訂單信息,按照手機號分片/分表的話,前提是需要該用戶的手機號 ...
  • 說說高斯模糊 高斯模糊的理論我這裡就不太多費話了,百度下太多,都是抄來抄去。 主要用到二個函數“高斯函數” 一維形式為: 二維形式為: X,Y對應的一維二維坐標,σ表示模糊半徑(半徑* 2 + 1) / 2) 根據這二個公式獲取對應的權重。 先看二維 假設我們現在圖片中的像素點位置為(0,0) 假設 ...
  • 關於轉換問題,剛開始我需要從資料庫讀出一個二進位數據流,並將其轉換成一個Image格式。 在不涉及資料庫的情況下,我先將一個圖片轉換成一個二進位數組顯示出來,再寫一個方法將其轉換成圖片image格式。 一、 先不涉及資料庫,將圖片轉換成二進位,在將二進位轉換成圖片。 第一步,我將圖片轉換成二進位數組 ...
  • ASP.NET Core是微軟ASP.NET Web框架的最新版本。於2016年6月發佈,相比之前ASP.NET有很多增量更新。 ASP.NET Core通過進行重大的體繫結構調整來提高開發人員的工作效率和向後相容性。重新設計Web框架和構建方式。 ASP.NET Core很多功能來至之前ASP.N... ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...