使用模型绑定上传小文件

HTML代码:

 <form method="post" enctype="multipart/form-data" asp-controller="Main" asp-action="UploadFiles">
<div class="form-group">
<div class="col-md-10">
<p>使用此表单上传一个或多个文件:</p>
<input type="file" name="files" multiple>
</div>
</div>
8 <div class="form-group">
<div class="col-md-10">
<input type="submit" value="上传">
</div>
</div>
13 </form>
@ViewBag.Message

为支持文件上传,HTML 窗体必须指定 multipart/form-data 的 enctype

form表单的 enctype 属性规定了form表单数据在发送到服务器时候的编码方式

multipart/form-data:指定传输数据为二进制数据,例如图片、mp3、文件

multiple属性规定输入字段可选择多个值(支持批量上传)

上传到服务器的单个文件可使用 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);
}

注意:切勿依赖或信任未经验证的 FileName 属性。 FileName 属性应仅用于显示目的。

在控制器的构造函数中注入 IHostingEnvironment 来获取网站根目录路径:

上传方法:

 public IActionResult UploadFiles(List<IFormFile> files)
{
long size = ;//文件大小
foreach (var file in files)
{
var fileName = file.FileName.Trim('"');//获取文件名
fileName = _hostingEnv.WebRootPath + $@"\{fileName}";//指定文件上传的路径
size += file.Length;
using (FileStream fs = System.IO.File.Create(fileName))//创建文件流
{
file.CopyTo(fs);//将上载文件的内容复制到目标流
fs.Flush();//清除此流的缓冲区并导致将任何缓冲数据写入
}
}
ViewBag.Message = $"{files.Count}个文件 /{size}字节上传成功!";
return View("Index");
17 }

使用 IFormFile 技术上传的文件在处理之前会缓存在内存中或 Web 服务器的磁盘中。 在操作方法中,IFormFile 内容可作为流访问。

运行结果:

在文件的根目录下可以看到上传的2文件:

上传成功!

以上上传功能使用表单提交,以下代码扩展使用Ajax请求提交

 HTML代码:

 <div class="row">
<div class="form-group">
<div class="col-md-10">
<p>上传一个或多个文件:</p>
<input type="file" id="files" name="files" multiple />
</div>
</div>
</div>
<div class="row">
<div class="form-group">
<div class="col-md-10">
<input type="button" id="upload" class="btn btn-success" style="cursor:pointer;" value="上传" />
</div>
</div>
</div>

JavaScript代码:

 $(function () {
$("#upload").click(function () {
var fileUpload = $("#files").get(0);//获得第一个files的名称和值
var files = fileUpload.files;//获取文件信息
var data = new FormData();//通过FormData构造函数创建一个空对象
for (var i = 0; i < files.length; i++) {
data.append(files[i].name, files[i]);//通过append方法追加数据
}
$.ajax({
type: "post",
url: "/Main/UploadFiles",
contentType: false,//不要去设置Content-Type请求头
processData: false,//不要去处理发送的数据
data: data,
success: function (data) {
alert(data.message);
},
error: function () {
alert("上传文件出现错误!");
}
});
});
})

上传方法:

 public IActionResult UploadFiles()
{
long size = ;//文件大小
var files = Request.Form.Files;//获取前端传过来的文件
foreach (var file in files)
{
var fileName = file.FileName.Trim('"');//获取文件名
fileName = _hostingEnv.WebRootPath + $@"\{fileName}";//指定文件上传的路径
size += file.Length;
using (FileStream fs = System.IO.File.Create(fileName))//创建文件流
{
file.CopyTo(fs);//将上载文件的内容复制到目标流
fs.Flush();//清除此流的缓冲区并导致将任何缓冲数据写入
}
}
return Json(new { message = $"{files.Count}个文件 /{size}字节上传成功!" });
17 }

备注:如果文件上传的大小或频率会导致应用出现资源问题,请考虑使用流式处理上传文件。

End!

ASP.NET Core MVC上传文件的更多相关文章

  1. 改造kindeditor支持asp.net core mvc上传文件

    kindtor默认使用的上传方法是使用目录下面的一般处理程序upload_json.ashx,暂时还不支持asp.net core下的文件上传,下面放出的自定义处理上传文件的接口方法. 自定义接收上传 ...

  2. ASP.NET Core MVC上传、导入、导出知多少

    前言 本君已成夜猫子,本节我们来讲讲ASP.NET Core MVC中的上传,这两天才研究批量导入功能,本节顺便简单搞搞导入.导出,等博主弄妥当了再来和大家一并分享. .NET Core MVC上传 ...

  3. asp.net core mvc上传大文件解决方案

    默认上传文件大小不超过30M 第一个问题: IIS 10.0 详细错误 - 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求. 服务器上的请求筛选被配置为拒绝该请求 ...

  4. asp.net core分块上传文件

    写完asp.net多文件上传(http://www.cnblogs.com/bestckk/p/5987383.html)后,感觉这种上传还是有很多缺陷,于是...(省略一万字,不废话).这里我没用传 ...

  5. asp.net MVC 上传文件 System.Web.HttpException: 超过了最大请求长度

    APS.NET MVC 上传文件出现  System.Web.HttpException: 超过了最大请求长度 这个问题 原因是 默认最大上传文件大小为4096,而我提交的文件太大了. 解决方案:修改 ...

  6. net core分块上传文件

    net core分块上传文件   写完asp.net多文件上传(http://www.cnblogs.com/bestckk/p/5987383.html)后,感觉这种上传还是有很多缺陷,于是...( ...

  7. Spring MVC上传文件

    Spring MVC上传文件 1.Web.xml中加入 <servlet> <servlet-name>springmvc</servlet-name> <s ...

  8. MVC上传文件

    ASP.NET MVC上传文件是必段撑握的知识.加强训练才是.以前Insus.NET曾使用第三方MyAjaxForm.js :http://www.cnblogs.com/insus/p/378548 ...

  9. 一、.Net Core 分块上传文件

    一..Net Core 分块上传文件 一.前端实现 @* For more information on enabling MVC for empty projects, visit http://g ...

随机推荐

  1. switch实现成绩打等级

    #include <stdio.h> int main() { int grade; scanf_s("%d", &grade); grade = grade ...

  2. HBuilder创建app 基础

    一.了解HBuilder HBuilder内封装了大量的书籍,极大方便了使用 官方文档: http://dev.dcloud.net.cn/mui/ui/ 关于布局: mhead  表头.mbody ...

  3. day37_8_21表的查询

    一.语法 表的查询一般使用select关键字,配合where筛选.顺序如下: # 先后顺序 from where select 二.where约束条件 首先先建立表: create table emp ...

  4. 子进程回收资源两种方式,僵尸进程与孤儿进程,守护进程,进程间数据隔离,进程互斥锁,队列,IPC机制,线程,守护线程,线程池,回调函数add_done_callback,TCP服务端实现并发

    子进程回收资源两种方式 - 1) join让主进程等待子进程结束,并回收子进程资源,主进程再结束并回收资源. - 2) 主进程 “正常结束” ,子进程与主进程一并被回收资源. from multipr ...

  5. leetcode206. 反转链表

    1:迭代法 假设存在链表 1 → 2 → 3 → Ø,我们想要把它改成 Ø ← 1 ← 2 ← 3. 在遍历列表时,将当前节点的 next 指针改为指向前一个元素.由于节点没有引用其上一个节点,因此必 ...

  6. 流媒体服务器 red5

    https://github.com/Red5/red5-server/releases/tag/v1.0.7-RELEASE   打开此链接  再tar包那里  复制链接地址 Wget此链接地址 W ...

  7. Linux学习笔记-第6天 - 问题的根本

    这些知识其实看起来很简单,之前不管是在学习C语言还是bat批处理,类似结构早已熟知. 但其实运用起来并不算好,可能真正的原因还 是在于得多练习吧.希望明年的今天自己不要再纠结与这些基础性的知识.

  8. [LeetCode] 477. Total Hamming Distance 全部汉明距离

    The Hamming distance between two integers is the number of positions at which the corresponding bits ...

  9. Django文件上传【单个/多个图片上传】

    准备工作 python:3.6.8 django:2.2.1 新建django项目 确定项目名称.使用的虚拟环境[当然这个也可以后期修改].app的名称 创建成功,选择在新的窗口中打开 图片上传 修改 ...

  10. 系统内置委托Action和func

    Action委托, action是系统内置的委托,它可指向无返回值,没有参数的方法. using System; using System.Collections.Generic; using Sys ...