本篇将和大家分享的丝.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-type
ServeUnknownFileTypes = 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,所以希望还在观望的朋友或领导们是时候开始行动了,一起努力推动社区的发展。

.NetCore之下载文件的更多相关文章

  1. Java下载文件(流的形式)

    @RequestMapping("download") @ResponseBody public void download(HttpServletResponse respons ...

  2. 使用批处理文件在FTP服务器 上传下载文件

    1.从ftp服务器根目录文件夹下的文件到指定的文件夹下 格式:ftp -s:[配置文件] [ftp地址] 如:ftp -s:c:\vc\ftpconfig.txt   192.168.1.1 建立一个 ...

  3. 通过form表单的形式下载文件。

    在项目中遇到问题,要求动态拼接uri下载文件.但是由于项目的安全拦截导致window.location.href 和 window.open等新建窗口的方法都不行. 无意间百度到了通过form表单来下 ...

  4. SecureCRT上传和下载文件

    SecureCRT上传和下载文件(下载默认目录) SecureCR 下的文件传输协议有ASCII .Xmodem .Ymodem .Zmodem ASCII:这是最快的传输协议,但只能传送文本文件. ...

  5. HTTP 错误 404.3 – Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。

    今天,在vs2013中新建了一个placard.json文件,当我用jq读取它的时候,去提示404,直接在浏览器访问这个文件,提示: HTTP 错误 404.3 – Not Found 由于扩展配置问 ...

  6. FTP下载文件失败

    这几天的定时任务下载文件的脚本失败了. 于是手工执行测试,发现报550 Permission denied. Passive mode refused. 意思就是被动模式下,没有权限获取文件. 解决方 ...

  7. 如何使用FileZilla上传和下载文件

    一.使用FileZilla上传文件 1 打开 FileZilla 按照如下图所示,填写远程 Linux 的 IP ,用户名,密码,还有端口号(默认22) 2 选中左边需要上传的文件,然后拖到右边,等待 ...

  8. 开发板tftp下载文件

    搭建过程: 1.安装相关软件包:tftpd(服务端),tftp(客户端),xinetd sudo apt-get install tftpd tftp xinetd 2.建立配置文件(蓝色的目录是可以 ...

  9. Linux上传下载文件快捷命令

    远程链接Linux(如SecrueCRT),要上传文件很下载文件到Linux服务器,只需要使用sz或者rz命令即可快速下载和上传文件了. 使用方法: 1.首先确保Linux服务器系统中安装了lrzsz ...

随机推荐

  1. STL空间配置器

    1.什么是空间配置器? 空间配置器负责空间配置与管理.配置器是一个实现了动态空间配置.空间管理.空间释放的class template.以内存池方式实现小块内存管理分配.关于内存池概念可以点击:内存池 ...

  2. Socket套接字

    socket编程,熟悉吧,那到底什么是socket呢?: 我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口,来供应用 ...

  3. jQuery实现鼠标滑过导航栏呈现不同的样式

    素材图片 源码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  4. live事件的替代方法on的使用注意事项

    根据jQuery的官方描述,live方法在1.7中已经不建议使用,在1.9中删除了这个方法.并建议在以后的代码中使用on方法来替代. on方法可以接受三个参数:事件名.触发选择器.事件函数. 需要特别 ...

  5. 使用nginx实现纯前端跨越

    你是否厌倦了老是依赖后台去处理跨域,把握不了主动权 你是否想模仿某个app倒腾一个demo,却困于接口无法跨域 那么很幸运,接下来我将现实不依赖任何后台,随心所欲的想访问哪个域名就访问哪个! 下载ng ...

  6. Oracle:解锁scott用户及设置密码

    关于Oracle 10g scott用户解锁的方法两则 解决方法一. 首先确认已经安装oracle 数据库和客户端 在客户端DOS下执行如下语句: 注意提示符号 c:\sqlplus /nolog s ...

  7. Docker 入门实践

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:张戈 导语 本文从新手视角记录了一个实际的Dokcer应用场景从创建.上传直到部署的详细过程,并简单的介绍了腾讯云容器服务的使用方法 ...

  8. Android学习记录:Paint,Canvas和Bitmap

    在Java中,利用过双缓冲技术,先将画笔画在内存上,再转化为图片,调出来. 当画的东西过多造成处理不过来时,双缓冲技术将防止闪屏. 在Paint方法下,我们这样写: BufferedImage tmp ...

  9. 自制裸眼3D图【推荐】

    Welcome to the World of Hidden 3D Stereograms.欢迎进入隐身3D图的世界! 网址:http://hidden-3d.com 裸眼立体图是什么? 立体图是立体 ...

  10. IPv4子网掩码回顾

    子网掩码的介绍: IP协议标准规定:每一个使用子网的节点都选择一个32位的位模式,若位模式中的某位置为1,则对应IP地址中的某位就为网络地址(包括网络部分和子网号)中的一位:若位模式中的某位置0,则对 ...