千家信息网

ASP.NET Core中怎么实现文件上传与下载

发表于:2025-01-25 作者:千家信息网编辑
千家信息网最后更新 2025年01月25日,这篇文章给大家介绍ASP.NET Core中怎么实现文件上传与下载,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.使用模型绑定上传文件(官方例子)官方机器翻译的地址:https
千家信息网最后更新 2025年01月25日ASP.NET Core中怎么实现文件上传与下载

这篇文章给大家介绍ASP.NET Core中怎么实现文件上传与下载,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

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

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

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

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

Form表单多个上传文件:

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

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

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

public async Task FileSave(List 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代码如下:

AJAX上传多文件:

编写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 files中是无法获取到文件的.

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

所以修改后台代码如下:

public async Task 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获取即可:

$(function () {

//实例化文件上传

$("#upfliediv").powerWebUpload({

auto: true, fileNumLimit: 1

});

$("#upfliediv").CleanUpload();

})

上传效果如图:

4.文件下载.

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

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

后台代码如下:

///

/// 文件流的方式输出 ///

///

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,所以写的比较简陋):

function downLoad() {            var filename = $("#filename").val();            _window.location.href = "@Url.Action("DownLoad")?file=" + filename;        }

效果如图:

关于ASP.NET Core中怎么实现文件上传与下载就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

文件 代码 后台 封装 前端 地址 控制器 效果 方法 表单 控制 机器翻译 内容 单位 大小 字节 官方 扩展名 文件名 方式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全 安全终端 监控 手提电脑苹果6刷机服务器失败 电子签名服务器 招标 网络技术发展趋势是怎样的 农产品网络安全法案例 软件开发流行开发工作 邮件服务器必须是公网吗 青岛智和云软件开发有限公司 求应聘软件开发工作 黑龙江pdu服务器电源销售价格 服务器安全狗的功能介绍 mc宝可梦服务器 boss多 云手机服务器怎么部署 软件开发转行做数据分析师 连到开放网络安全吗 网络数据库管理和数据库技术 黑龙江网络技术开发热线 宏基网络安全事件 oracle免费数据库 酒店网络安全报告 注册上海软件开发公司 王牌竞速最新服务器叫什么名儿 升腾服务器购买 济南市网络安全事件应急预案 软件开发需求 英文 川大网络安全少年班好就业吗 与不加密的服务器连接安全吗 查看mysql数据库文件 网络安全手抄报画多字少又好看 宏基网络安全事件
0