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