ASP.NET Core文件上传与下载(多种上传方式)

 
前言

前段时间项目上线,实在太忙,最近终于开始可以研究研究ASP.NET Core了.

打算写个系列,但是还没想好目录,今天先来一篇,后面在整理吧.

ASP.NET Core 2.0 发展到现在,已经很成熟了.下个项目争取使用吧.

正文

1.使用模型绑定上传文件(官方例子)

官方机器翻译的地址:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads

这里吐槽一下 - -,这TM的机器翻译..还不如自己看E文的..

首先我们需要创建一个form表单如下:

    <form method="post" enctype="multipart/form-data" asp-controller="UpLoadFile" asp-action="FileSave">
<div>
<div>
<p>Form表单多个上传文件:</p>
<input type="file" name="files" multiple />
<input type="submit" value="上传" />
</div>
</div>
</form>

其中,asp-controllerasp-action,(这个是TagHelper的玩法,以后讲)是我们要访问的控制器和方法.

给我们的input标签加上 multiple 属性,来支持多文件上传.

创建一个控制器,我们编写上传方法如下:

 public async Task<IActionResult> FileSave(List<IFormFile> files)
{
var files = Request.Form.Files;
long size = files.Sum(f => f.Length);
string webRootPath = _hostingEnvironment.WebRootPath;
string contentRootPath = _hostingEnvironment.ContentRootPath;
foreach (var formFile in files)
{
if (formFile.Length > 0)
{ string fileExt = GetFileExt(formFile.FileName); //文件扩展名,不含“.”
long fileSize = formFile.Length; //获得文件大小,以字节为单位
string newFileName = System.Guid.NewGuid().ToString() + "." + fileExt; //随机生成新的文件名
var filePath = webRootPath +"/upload/" + newFileName;
using (var stream = new FileStream(filePath, FileMode.Create))
{ await formFile.CopyToAsync(stream);
}
}
} return Ok(new { count = files.Count, size });
}

这里我们采用Asp.NET Core的新接口IFormFile,  IFormFile的具体定义如下:

public interface IFormFile
{
string ContentType { get; }
string ContentDisposition { get; }
IHeaderDictionary Headers { get; }
long Length { get; }
string Name { get; }
string FileName { get; }
Stream OpenReadStream();
void CopyTo(Stream target);
Task CopyToAsync(Stream target, CancellationToken cancellationToken = null);
}

上面的代码使用了IHostingEnvironment来获取项目的根目录地址.

构造函数注入的代码如下:

        private readonly IHostingEnvironment _hostingEnvironment;

        public UpLoadFileController(IHostingEnvironment hostingEnvironment)
{
_hostingEnvironment = hostingEnvironment;
}

这样,我们就完成了控制器的编写,然后到运行前端,上传文件..效果如下:

通过IFormFile的CopyToAsync方法,我们就可以把这个文件流复制下来并保存到本地即可.

2.使用Ajax上传文件

上面我们是使用表单上传,但是项目过程中,大部分情况会使用Ajax进行上传,所以我们就来讲讲如何使用Ajax上传.

首先编写HTML代码如下:

<div>
<form id="uploadForm">
AJAX上传多文件: <input type="file" name="file" multiple />
<input type="button" value="上传" onclick="doUpload()" />
</form>
</div>

编写JS代码如下(这里我们使用FormData对象来上传):

 function doUpload() {
var formData = new FormData($("#uploadForm")[0]);
$.ajax({
url: '@Url.Action("FileSave")',
type: 'POST',
data: formData,
async: false,
cache: false,
contentType: false,
processData: false,
success: function (returndata) {
alert(returndata);
},
error: function (returndata) {
alert(returndata);
}
});
}

后台代码不做任何修改.我们会发现.直接在List<IFormFile> files中是无法获取到文件的.

通过调试,我们可以发现,文件是上传成功的,但是放在了Request.Form.Files当中.

所以修改后台代码如下:

public async Task<IActionResult> FileSave()
{
var date = Request;
var files = Request.Form.Files;
long size = files.Sum(f => f.Length);
string webRootPath = _hostingEnvironment.WebRootPath;
string contentRootPath = _hostingEnvironment.ContentRootPath;
foreach (var formFile in files)
{
if (formFile.Length > 0)
{ string fileExt = GetFileExt(formFile.FileName); //文件扩展名,不含“.”
long fileSize = formFile.Length; //获得文件大小,以字节为单位
string newFileName = System.Guid.NewGuid().ToString() + "." + fileExt; //随机生成新的文件名
var filePath = webRootPath +"/upload/" + newFileName;
using (var stream = new FileStream(filePath, FileMode.Create))
{ await formFile.CopyToAsync(stream);
}
}
} return Ok(new { count = files.Count, size });
}

改为直接从Request.Form.Files中获取文件集合.~

3.使用webUploader上传文件

很久之前..呃..封装过一个webUploader的JS.如下:

对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

对百度WebUploader的二次封装,精简前端代码之图片预览上传(两句代码搞定上传)

..我们也用封装好的JS来试试.HTML和JS代码如下,后台代码不需要修改,还是直接从Request.Form.Files获取即可:

<div id="upfliediv"></div>
$(function () {

        //实例化文件上传

        $("#upfliediv").powerWebUpload({
auto: true, fileNumLimit: 1
});
$("#upfliediv").CleanUpload(); })

上传效果如图:

4.文件下载.

上传了文件,我们当然需要下载.

直接通过URL+地址下载是一种极其不安全的方式.这里我们采用返回流的形式来下载.

后台代码如下:

        /// <summary>
/// 文件流的方式输出 /// </summary>
/// <returns></returns>
public IActionResult DownLoad(string file)
{
var addrUrl = file;
var stream = System.IO.File.OpenRead(addrUrl);
string fileExt = GetFileExt(file);
//获取文件的ContentType
var provider = new FileExtensionContentTypeProvider();
var memi = provider.Mappings[fileExt];
return File(stream, memi, Path.GetFileName(addrUrl));
}

这里值得注意的是,以前我们想获取ContentType直接使用MimeMapping.GetMimeMapping(file);就好了.

但是这个类是在System.Web下的,core已经抛弃了现有的System.Web.

所以在ASP.NET Core中我们需要通过新的类FileExtensionContentTypeProvider来获取文件的ContentType

编写HTML+JS代码如下(PS:因为是demo,所以写的比较简陋):

<div>
<input type="text" id="filename" /><button onclick="downLoad()">下载</button>
</div>
 function downLoad() {
var filename = $("#filename").val();
window.location.href = "@Url.Action("DownLoad")?file=" + filename; }

效果如图:

写在最后

到此,本篇就结束了,感兴趣的,请点个关注或者推荐.~谢谢.博客也新增了ASP.NET Core的分类文章,以后关于ASP.NET Core的文章都会归类在里面.

作者:顾振印 出处:http://www.cnblogs.com/GuZhenYin/ 如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

[转载]ASP.NET Core文件上传与下载(多种上传方式)的更多相关文章

  1. ASP.NET Core文件上传与下载(多种上传方式)

    前言 前段时间项目上线,实在太忙,最近终于开始可以研究研究ASP.NET Core了. 打算写个系列,但是还没想好目录,今天先来一篇,后面在整理吧. ASP.NET Core 2.0 发展到现在,已经 ...

  2. ASP.NET Core文件上传IFormFile于Request.Body的羁绊

    前言 在上篇文章深入探究ASP.NET Core读取Request.Body的正确方式中我们探讨了很多人在日常开发中经常遇到的也是最基础的问题,那就是关于Request.Body的读取方式问题,看是简 ...

  3. ASP.NET Core文件压缩最佳实践

    前言 在微软官方文档中,未明确指出文件压缩功能的使用误区. 本文将对 ASP.NET Core 文件响应压缩的常见使用误区做出说明. 误区1:未使用 Brotil 压缩 几乎不需要任何额外的代价,Br ...

  4. ASP.NET Core中配置监听URLs的五种方式

    原文: 5 ways to set the URLs for an ASP.NET Core app 作者: Andrew Lock 译者: Lamond Lu 默认情况下,ASP. NET Core ...

  5. ASP.NET Core 文件上传

    前言 上篇博文介绍了怎么样在 asp.net core 使用 Redis 和 Protobuf 进行 Session缓存.本篇的是开发过程中使用的一个小功能,怎么做单文件和多文件上传. 如果你觉得对你 ...

  6. Asp.Net Core 文件上传处理

    本文主要介绍后台接收处理 1.在使用控制器接收 : [HttpPost] : public IActionResult UploadFiles(IList<IFormFile> files ...

  7. asp.net core 通过ajax上传图片及wangEditor图片上传

    asp.net core 通过ajax上传图片 .net core前端代码,因为是通过ajax调用,首先要保证ajax能调用后台代码,具体参见上一篇.net core 使用ajax调用后台代码. 前端 ...

  8. 无法下载apk等格式的文件的解决方案---ASP .NET Core 2.0 MVC 发布到IIS上以后无法下载apk等格式的文件的解决方案

    ASP .NET Core MVC 发布到  IIS 上以后 无法下载apk等格式的文件 使用.NET Core MVC创建了一个站点,其他文件可以下载,但是后来又需求,就把手机端的apk合适的文件上 ...

  9. ASP .NET Core 2.0 MVC 发布到 IIS 上以后 无法下载apk等格式的文件

    ASP .NET Core MVC 发布到  IIS 上以后 无法下载apk等格式的文件 使用.NET Core MVC创建了一个站点,其他文件可以下载,但是后来又需求,就把手机端的apk合适的文件上 ...

随机推荐

  1. Vue-es6基础语法

    什么是ES6 ECMAScript 6 简称ES6, 在2015年6月正式发布~  ECMAScript 是JavaScript语言的国际标准. 我们本着二八原则,掌握好常用的,有用的~能让我们更快的 ...

  2. LOJ166 拉格朗日插值 2【卷积,NTT】

    题目链接:LOJ 题目描述:输入多项式的次数$n$,一个整数$m$和$f(0),f(1),f(2),\ldots,f(n)$,输出$f(m),f(m+1),f(m+2),\ldots,f(m+n)$ ...

  3. 畅通工程续(HDU 1874)(简单最短路)

    某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在 ...

  4. JDK1.6历史版本的下载(關於TLSv1.2)Oracle的官方文檔

    [资源描述]:对于部分老项目 仍然采用的是JDK1.6 版本 但是打开官方 JDK 都是最新的 版本 想找 历史版本 不容易找到 [资源详情]:提供下载链接: http://www.oracle.co ...

  5. 基于docker的sqli-labs搭建

    一键代码: curl https://files-cdn.cnblogs.com/files/kagari/sqli-labs.sh|bash https://files-cdn.cnblogs.co ...

  6. Flutter移动电商实战 --(33)列表页_子类和商品列表交互效果

    主要实现点击小类下面的列表跟着切换 获取右侧下面的列表信息,即要传递大类的id也要传递小类的,所以需要把左侧的大类的id也要Provide化 可以看下网站上的接口说明: https://jspang. ...

  7. Java同步数据结构之ConcurrentLinkedQueue

    前言 前面介绍的Queue都是通过Lock锁实现的阻塞队列,今天介绍一种非阻塞队列ConcurrentLinkedQueue,所谓非阻塞,其实就是通过CAS代替加锁来实现的高效的非阻塞队列.当许多线程 ...

  8. 树莓派根分区扩展至整张sd卡

    第一步,安装raspi-config sudo apt-get install raspi-config 第二步,运行raspi-config sudo raspi-config 界面选择,Expan ...

  9. git撤销某次提交

    1.查询提交记录.进入目录,查看某人在此目录下的commit: panxi@ww-bj-panxi MINGW64 [path]/Business (feature/v2.3) $ git log f ...

  10. Vue的基础学习

    一.Vue的计算属性:get和set属性 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...