.NetCore之下载文件

本篇将和大家分享的丝.NetCore下载文件,常见的下载有两种:A标签直接指向下载文件地址和post或get请求后台输出文件流的方式,本篇也将围绕这两种来分享;如果对您有好的帮助,请多多支持。

  • 允许站点不识别content-type下载文件(即:不受mime类型限制下载)

  • 如何允许下载.nupkg和.apk后缀的文件

  • Razor模板的post下载文件例子

  • 半年来使用NetCore的一些感想和焦虑

允许站点不识别content-type下载文件(即:不受mime类型限制下载)

对于netcore的web项目而言,内置了一些content-type允许下载的文件类型;我们将通过一个普通的razorweb项目来看看直接通过连接下载excel例子;首先,在项目的wwwroot目录创建一个bak文件夹,然后在该目录下存放如下几种文件:

然后不用修改任何代码或设置,直接启动站点,再直接在浏览器地址栏分别录入下载文件地址,如:

http://localhost:1120/bak/excel.xls

http://localhost:1120/bak/love.apk

http://localhost:1120/bak/stackexchange.redis.1.2.6.nupkg

http://localhost:1120/bak/Startup.cs

通过测试这个时候只有excel.xls文件是能直接被下载的,其他的都是404:

要想.apk,.nupkg.cs等后缀的文件不被限制,我们可以通过 public static IApplicationBuilder UseStaticFiles(this IApplicationBuilder app, StaticFileOptions options); 扩展来设置,我们仅仅只需要修改为如下代码:

            app.UseStaticFiles(new StaticFileOptions{                //设置不限制content-typeServeUnknownFileTypes = true });

然后在重启运行,这个时候我们再来访问下载这几个文件就没问题了(注意这个时候下载任何后缀的文件都行),如下截图:

至于cs后缀的文件在google浏览器中是直接显示的内容,这里就不贴图了,有兴趣的可以试试;

如何允许下载.nupkg和.apk后缀的文件

通过上面例子我们能够使用 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下载文件例子

老实说最近一端时间有空我就会研究下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的一些感想和焦虑

感想:

到目前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,所以希望还在观望的朋友或领导们是时候开始行动了

原文地址:http://www.cnblogs.com/wangrudong003/p/7592689.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jeecg-boot中如何修改自定义主题颜色

大家好&#xff0c;我是雄雄。 前言 今天第一次上老丈人家&#xff0c;哈哈哈&#xff0c;有点猝不及防&#xff0c;本来没准备去&#xff0c;结果正好在小区门口碰到&#xff0c;人家让我去&#xff0c;我就把后备箱里面的东西拿下来带着去的。 聊了几个小时&#xff0c;也还…

开封一游后续

游玩过开封后还是很累的&#xff0c;等几个小时的火车更是相当的累。今天有缘坐火车的时候身边是一姑娘&#xff0c;前面没怎么聊&#xff0c;后面她讲她也是八点多到的&#xff0c;我就问她是不是阜阳的&#xff0c;和我们一个学校吗&#xff1f;就这样聊了起来&#xff0c;讲…

P1156-垃圾陷阱【dp】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP1156 题目大意 有若干个垃圾&#xff0c;在tit_iti​时掉落&#xff0c;可以选择吃掉多活fif_ifi​天&#xff0c;也可以堆hih_ihi​高度&#xff0c;高度到达DDD就可以脱逃&#xff0c;求最短逃脱时…

跨平台应用集成(在ASP.NET Core MVC 应用程序中集成 Microsoft Graph)

1谈一谈.NET 的跨平台终于要写到这一篇了。跨平台的支持可以说是 Office 365 平台在设计伊始就考虑的目标。我在前面的文章已经提到过了&#xff0c;Microsoft Graph 服务针对一些主流的开源平台&#xff08;主要用来做跨平台应用&#xff09;都有支持&#xff0c;例如 python,…

两年 JAVA 程序员的面试总结

转载自 两年 JAVA 程序员的面试总结 前言 工作两年左右&#xff0c;实习一年左右&#xff0c;正式工作一年左右&#xff0c;其实挺尴尬的&#xff0c;高不成低不就。因此在面试许多公司&#xff0c;找到了目前最适合自己的公司之后。于是做一个关于面试的总结。希望能够给那…

用指针完成函数参数的调用

#include<stdio.h>addUp(int a,int b,int c){ cab;printf("%d\n",c); return c;}main(){int c;addUp(6,5,c);printf("%d",c); }可以在函数中完成数字的加减但是发现无法再主函数中调用&#xff0c;是个初始值22&#xff0c;所有得想个办法将函数的值…

P1220-关路灯【区间dp】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP1220 题目大意 有n盏灯&#xff0c;每个灯的所在位置和1s消耗的能量不同&#xff0c;现在一个人在c号灯下&#xff0c;他行走速度1m/s&#xff0c;他走到的地方灯会熄灭&#xff0c;求最少消耗能量。…

Java 8中Stream API的这些奇技淫巧!你都Get到了吗?

转载自 Java 8中Stream API的这些奇技淫巧&#xff01;你都Get到了吗&#xff1f; Stream简介 Java 8引入了全新的Stream API。这里的Stream和I/O流不同&#xff0c;它更像具有Iterable的集合类&#xff0c;但行为和集合类又有所不同。stream是对集合对象功能的增强&#x…

基于Office 365的随需应变业务应用平台

这是我去年10月底在微软技术大会&#xff08;Microsoft Ignite 2016) 上面的演讲主题&#xff0c;承蒙大家抬爱&#xff0c;也沾了前一场明星讲师的光&#xff0c;我记得会场几乎是满座。观众中既有IT部门的技术人员&#xff0c;也有业务部门的用户&#xff0c;也有少量的开发人…

关于return的用法

return其实就是个返回值&#xff0c;你要是想获得它只需开辟一个空间&#xff0c;赋值即可 让a该函数&#xff1b;即可获得返回值 下面是利用返回值和函数直接打印出两数相乘 #include<stdio.h>add(int p,int q){return p*q;}int main(){int aadd(10,55);printf("%…

jeecg中新建接口后报错404的解决方法

大家好&#xff0c;我是雄雄。 前言 最近项目中&#xff0c;一直用的是jeecg-boot的微服务版本&#xff0c;尤其是第一次用微服务&#xff0c;所以在用的过程中&#xff0c;各种问题层出不穷&#xff0c;我们就在边学习边应用的道路上缓缓前进。 索性现在项目已经做的差不多了…

P2672-推销员【贪心】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP2672 题目大意 每家住户有一个位置lil_ili​&#xff0c;推销会产生的疲劳值aia_iai​&#xff0c;向X家住户推销产品&#xff0c;对于每个X&#xff0c;要求使 ∑i1Xaxi2∗max{lxi}\sum_{i1}^{X}a_{…

一分钟理解Java公平锁与非公平锁

转载自 一分钟理解Java公平锁与非公平锁 和朋友聊天他提到&#xff1a;ReentrantLock 的构造函数可以传递一个 bool 数据&#xff0c;true 时构造的是“公平锁”、false 时构造的是“非公平锁”。我的印象中锁是不区分类型的&#xff0c;所以认为这应该是 Java 发明的概念&…

为什么你需要将代码迁移到ASP.NET Core 2.0?

随着 .NET Core 2.0 的发布&#xff0c;.NET 开源跨平台迎来了新的时代。开发者们可以选择使用命令行、个人喜好的文本编辑器、Visual Studio 2017 15.3 和 Visual Studio Code 来开发自己的 .NET Core 2.0 项目。同时&#xff0c;微软 .NET 开发工具组也宣布了 ASP.NET Core 2…

typedef用法

#include<stdio.h> typedef struct Student {int age;int score;}St; int main(){St st{200,100};//等价于 struct Student st 直接命名&#xff0c;省略/很多不必要步骤 printf("%d",st.age);}typedef的核心在于指针而不是仅仅简化了结构 #include<stdi…

jeecg-boot中如何放开接口路由

大家好&#xff0c;我是雄雄。 前言 今天是国庆假期的第5天了&#xff0c;7天的时间&#xff0c;感觉过的挺快&#xff0c;前三天都在下雨&#xff0c;后四天降温冻的瑟瑟发抖。 这次假期完事儿了之后就到元旦&#xff0c;春节了&#xff0c;得好好的珍惜。 今天介绍一下&…

nssl1174-阶乘【!基础!数论】

前言 比赛时xjq说这道题很水&#xff0c;是个基础数论。 然后… 就连交都没交 正题 给出n个数&#xff0c;求一个最小的mmm使得 m!∏i1naiq(q∈N)\frac{m!}{\prod_{i1}^na_i}q(q\in N_)∏i1n​ai​m!​q(q∈N​) 解题思路 我们考虑因为要求在一起的乘积&#xff0c;所以个体…

带着小C看动物

大家好&#xff0c;我是雄雄。 整个国庆假期期间&#xff0c;一出门就背着我的小C书包出去。 第一天带着我对象的妈妈去医院检查了下&#xff0c;然后去原来酒店老板那喝羊汤。第二天准备去我对象家的东西&#xff0c;去超市买了一后备箱&#xff0c;晚上就去她家了趟&#xf…

弹性和瞬态故障处理库Polly介绍

前言本节我们来介绍一款强大的库Polly&#xff0c;Polly是一种.NET弹性和瞬态故障处理库&#xff0c;允许我们以非常顺畅和线程安全的方式来执诸如行重试&#xff0c;断路&#xff0c;超时&#xff0c;故障恢复等策略。 Polly针对对.NET 4.0&#xff0c;.NET 4.5和.NET Standar…

运用递归函数求阶乘

#include<stdio.h>f(int n) {if(n1){ }else {return n*f(n-1);} }main() {int a;af(5);printf("%d",a);} 事实上就是应用了梯归的方法。 不打算继续学c的数据结构了&#xff0c;主要精力放在能够变现的html和python上&#xff0c;打算开启新的篇章&#…