本篇將和你們分享的絲.NetCore下載文件,常見的下載有兩種:A標籤直接指向下載文件地址和post或get請求後臺輸出文件流的方式,本篇也將圍繞這兩種來分享;若是對您有好的幫助,請多多支持。html
對於netcore的web項目而言,內置了一些content-type容許下載的文件類型;咱們將經過一個普通的razorweb項目來看看直接經過鏈接下載excel例子;首先,在項目的wwwroot目錄建立一個bak文件夾,而後在該目錄下存放以下幾種文件:android
而後不用修改任何代碼或設置,直接啓動站點,再直接在瀏覽器地址欄分別錄入下載文件地址,如:git
http://localhost:1120/bak/excel.xlsweb
http://localhost:1120/bak/love.apkredis
http://localhost:1120/bak/stackexchange.redis.1.2.6.nupkg後端
http://localhost:1120/bak/Startup.csapi
經過測試這個時候只有excel.xls文件是能直接被下載的,其餘的都是404:瀏覽器
要想.apk,.nupkg.cs等後綴的文件不被限制,咱們能夠經過 public static IApplicationBuilder UseStaticFiles(this IApplicationBuilder app, StaticFileOptions options); 擴展來設置,咱們僅僅只須要修改成以下代碼:安全
app.UseStaticFiles(new StaticFileOptions { //設置不限制content-type ServeUnknownFileTypes = true });
而後在重啓運行,這個時候咱們再來訪問下載這幾個文件就沒問題了(注意這個時候下載任何後綴的文件都行),以下截圖:服務器
至於cs後綴的文件在google瀏覽器中是直接顯示的內容,這裏就不貼圖了,有興趣的能夠試試;
經過上面例子咱們可以使用 ServeUnknownFileTypes = true; 直接設置無限制下載文件類型,這種一般不是太好或者說不容許,亦或者不常說的不安全吧;若是咱們只須要增長.nupkg和.apk後綴的文件的下載,那麼能夠經過以下代碼來添加mime類型,如:
app.UseStaticFiles(new StaticFileOptions { //ServeUnknownFileTypes = true ContentTypeProvider = new FileExtensionContentTypeProvider(new Dictionary<string, string> { { ".apk","application/vnd.android.package-archive"}, { ".nupkg","application/zip"} }) });
一樣的也能對excel,apk,nupkg後綴的文件進行下載:
可是這個時候咱們訪問 http://localhost:1120/bak/Startup.cs 就得不到下載的內容了:
由於咱們沒有添加對.cs文件的擴展類型,故而系統直接給咋們返回404;這裏咱們經過FileExtensionContentTypeProvider對象的構造函數傳遞了一個mapping的dic類型來讓項目知道容許下載的content-type類型的文件;
老實說最近一端時間有空我就會研究下Razor模板,下面咱們將經過她的post表單的方式來請求後端下載文件的方法;下面直接給出login.cshtml文件的代碼:
@page @model LoginModel @{} <form method="post"> <button type="submit" asp-page-handler="down" class="btn">下載</button> <button type="submit" asp-page-handler="down01" class="btn">下載01</button> <button type="submit" asp-page-handler="down02" class="btn">下載02</button> </form>
這裏值得注意的是,razor經過asp-page-handler=來執行請求後端的方法,咱們來看看最終她生成的html代碼後是什麼樣子的:
可以看出這裏主要經過handler做爲參數名稱來傳遞請求的後端方法,下面再來看看後端代碼這樣寫的(爲了方便下載文件的路勁我以love.apk爲例):
/// <summary> /// 虛擬文件地址輸出下載 /// </summary> /// <returns></returns> public IActionResult OnPostDown() { var addrUrl = "/bak/love.apk"; return File(addrUrl, "application/vnd.android.package-archive", Path.GetFileName(addrUrl)); } /// <summary> /// 文件流的方式輸出 /// </summary> /// <returns></returns> public IActionResult OnPostDown01() { var addrUrl = @"D:\F\學習\vs2017\netcore\Study.AspNetCore\WebApp02-1\wwwroot\bak\love.apk"; var stream = System.IO.File.OpenRead(addrUrl); return File(stream, "application/vnd.android.package-archive", Path.GetFileName(addrUrl)); } /// <summary> /// 經過HttpClient獲取另外站點的文件流,再輸出 /// </summary> /// <returns></returns> public async Task<IActionResult> OnPostDown02() { var path = "https://files.cnblogs.com/files/wangrudong003/%E7%89%B9%E4%BB%B701.gif"; HttpClient client = new HttpClient(); client.BaseAddress = new Uri(path); var stream = await client.GetStreamAsync(path); return File(stream, "application/vnd.android.package-archive", Path.GetFileName(path)); }
後端3個post接受方法都一樣使用了FileStreamResult來輸出下載文件,不一樣點在於文件來源不一樣;
對於簡單一些的站點來講,下載文件通常存在於站點目錄下,有點相似於我這裏的wwwroot/bak目錄,所以可以經過站點虛擬目錄下載,也就是咋們第一種的下載方式;
有一些站點爲了文件安全性,通常會存在於web站點的相同服務器磁盤中,所以須要經過這裏的第二種方式獲取文件流,再傳遞給File();
最後一種就是把本身其餘站點或者別人站點上的文件轉一下,當作本身的文件來輸出,這種方式也就是咋們常說的盜鏈方式之一;
對於razor的handler參數,這裏須要注意的是她對應是咋們後端代碼OnGetxxx或者OnPostxxx方法中的xxx名稱,這是一種razor請求規範,必需要遵照哦。
感想:
到目前netcore最新版本2.0,其api很強大了,就目前我作的幾個項目使用來看,她api支持度很好;以前遇到過也有人問過我有處理圖片的api嗎,答案是確定的,如今nuget包社區已經有不少種包支持圖片處理了,有興趣的朋友能夠去看看https://www.nuget.org/packages;在穿插了幾個項目後,深入感受netcore的學習成本其實並不高,就netcore的mvc項目而言,只要以前會mvc框架,或是webform(我的感受對應razor)那用起來是無壓力;這裏建議有些不敢嘗試netcore2.0的朋友或者覺的有學習成本的朋友不妨試試;netcore官網文檔:https://docs.microsoft.com/en-us/aspnet/core/
焦慮:
netcore2.0出來仍是有段時間了,這段時間儘管有不少朋友在博客園分享不少相關的文章和git上的項目;可是在3個netqq羣中反應或者提出netcore開發遇到的問題狀況來看仍是不多,不禁讓人擔憂;固然了我所知道的幾個大牛們或公司的部分技術決策層的人也在關注並也陸續用這再作新項目;其餘城市我不瞭解,就北京這邊頗有一些創業公司的創業項目起始點就用的是netcore,因此但願還在觀望的朋友或領導們是時候開始行動了,一塊兒努力推進社區的發展。