這篇文章主要介紹.Net Core如何實現(xiàn)下載文件,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)專注于巴楚企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站定制開發(fā)。巴楚網(wǎng)站建設(shè)公司,為巴楚等地區(qū)提供建站服務(wù)。全流程專業(yè)公司,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)允許站點不識別content-type下載文件(即:不受mime類型限制下載)
如何允許下載.nupkg和.apk后綴的文件
Razor模板的post下載文件例子
半年來使用NetCore的一些感想和焦慮
對于netcore的web項目而言,內(nèi)置了一些content-type允許下載的文件類型;我們將通過一個普通的razorweb項目來看看直接通過連接下載excel例子;首先,在項目的wwwroot目錄創(chuàng)建一個bak文件夾,然后在該目錄下存放如下幾種文件:
通過測試這個時候只有excel.xls文件是能直接被下載的,其他的都是404:
要想.apk,.nupkg.cs等后綴的文件不被限制,我們可以通過 public static IApplicationBuilder UseStaticFiles(this IApplicationBuilder app, StaticFileOptions options); 擴(kuò)展來設(shè)置,我們僅僅只需要修改為如下代碼:
app.UseStaticFiles(new StaticFileOptions { //設(shè)置不限制content-type ServeUnknownFileTypes = true });
然后在重啟運(yùn)行,這個時候我們再來訪問下載這幾個文件就沒問題了(注意這個時候下載任何后綴的文件都行),如下截圖:
至于cs后綴的文件在google瀏覽器中是直接顯示的內(nèi)容,這里就不貼圖了,有興趣的可以試試;
通過上面例子我們能夠使用 ServeUnknownFileTypes = true; 直接設(shè)置無限制下載文件類型,這種通常不是太好或者說不允許,亦或者不常說的不安全吧;如果我們只需要增加.nupkg和.apk后綴的文件的下載,那么可以通過如下代碼來添加mime類型,如:
app.UseStaticFiles(new StaticFileOptions { //ServeUnknownFileTypes = true ContentTypeProvider = new FileExtensionContentTypeProvider(new Dictionary{ { ".apk","application/vnd.android.package-archive"}, { ".nupkg","application/zip"} }) });
同樣的也能對excel,apk,nupkg后綴的文件進(jìn)行下載:
但是這個時候我們訪問 http://localhost:1120/bak/Startup.cs 就得不到下載的內(nèi)容了:
因為我們沒有添加對.cs文件的擴(kuò)展類型,故而系統(tǒng)直接給咋們返回404;這里我們通過FileExtensionContentTypeProvider對象的構(gòu)造函數(shù)傳遞了一個mapping的dic類型來讓項目知道允許下載的content-type類型的文件;
老實說最近一端時間有空我就會研究下Razor模板,下面我們將通過她的post表單的方式來請求后端下載文件的方法;下面直接給出login.cshtml文件的代碼:
@page @model LoginModel @{}
這里值得注意的是,razor通過asp-page-handler=來執(zhí)行請求后端的方法,我們來看看最終她生成的html代碼后是什么樣子的:
能夠看出這里主要通過handler作為參數(shù)名稱來傳遞請求的后端方法,下面再來看看后端代碼這樣寫的(為了方便下載文件的路勁我以love.apk為例):
////// 虛擬文件地址輸出下載 /// ///public IActionResult OnPostDown() { var addrUrl = "/bak/love.apk"; return File(addrUrl, "application/vnd.android.package-archive", Path.GetFileName(addrUrl)); } /// /// 文件流的方式輸出 /// ///public IActionResult OnPostDown01() { var addrUrl = @"D:\F\學(xué)習(xí)\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)); } /// /// 通過HttpClient獲取另外站點的文件流,再輸出 /// ///public async Task 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站點的相同服務(wù)器磁盤中,因此需要通過這里的第二種方式獲取文件流,再傳遞給File();
最后一種就是把自己其他站點或者別人站點上的文件轉(zhuǎn)一下,當(dāng)做自己的文件來輸出,這種方式也就是咋們常說的盜鏈方式之一;
對于razor的handler參數(shù),這里需要注意的是她對應(yīng)是咋們后端代碼OnGetxxx或者OnPostxxx方法中的xxx名稱,這是一種razor請求規(guī)范,必須要遵守哦。
以上是.Net Core如何實現(xiàn)下載文件的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。