使用模型绑定上传小文件

HTML代码:

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

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

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

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

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

上传到服务器的单个文件可使用 IFormFile 接口通过模型绑定进行访问,该接口定义如下:

  1. public interface IFormFile
  2. {
  3. string ContentType { get; }
  4. string ContentDisposition { get; }
  5. IHeaderDictionary Headers { get; }
  6. long Length { get; }
  7. string Name { get; }
  8. string FileName { get; }
  9. Stream OpenReadStream();
  10. void CopyTo(Stream target);
  11. Task CopyToAsync(Stream target, CancellationToken cancellationToken = null);
  12. }

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

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

上传方法:

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

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

运行结果:

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

上传成功!

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

 HTML代码:

  1. <div class="row">
  2. <div class="form-group">
  3. <div class="col-md-10">
  4. <p>上传一个或多个文件:</p>
  5. <input type="file" id="files" name="files" multiple />
  6. </div>
  7. </div>
  8. </div>
  9. <div class="row">
  10. <div class="form-group">
  11. <div class="col-md-10">
  12. <input type="button" id="upload" class="btn btn-success" style="cursor:pointer;" value="上传" />
  13. </div>
  14. </div>
  15. </div>

JavaScript代码:

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

上传方法:

  1. public IActionResult UploadFiles()
  2. {
  3. long size = ;//文件大小
  4. var files = Request.Form.Files;//获取前端传过来的文件
  5. foreach (var file in files)
  6. {
  7. var fileName = file.FileName.Trim('"');//获取文件名
  8. fileName = _hostingEnv.WebRootPath + $@"\{fileName}";//指定文件上传的路径
  9. size += file.Length;
  10. using (FileStream fs = System.IO.File.Create(fileName))//创建文件流
  11. {
  12. file.CopyTo(fs);//将上载文件的内容复制到目标流
  13. fs.Flush();//清除此流的缓冲区并导致将任何缓冲数据写入
  14. }
  15. }
  16. return Json(new { message = $"{files.Count}个文件 /{size}字节上传成功!" });
  17. 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. JS高阶---显式原型和隐式原型

    前言: 1.函数对象即函数的prototype原型属性指向原型对象,在创建函数时便存在,默认为空Object 2.实例对象的__proto__隐式原型在实例化创建实例时产生,值等于构造函数的显式pro ...

  2. js闭包和原型链好文

    http://www.cnblogs.com/wangfupeng1988/p/3977924.html

  3. Appium基础:Desired Capabilities详讲

    Desired Capabilities在启动session的时候是必须提供的,先看如下代码: Desired Capabilities本质上是key value的对象,他告诉appium serve ...

  4. python批量修改文件名(以修改图片名为例)

    #coding=utf-8import sys, string, os, shutil #输入目录名和前缀名,重命名后的名称结构类似prefix_0001 def RenameFiles(srcdir ...

  5. leetcode14最长公共前缀

    class Solution { public: string longestCommonPrefix(vector<string>& strs) { ) return " ...

  6. Philosopher(set 线段树合并)

    直接维护乘积是肯定不可行的, 精度会爆炸, 于是我们来维护对数的和, 最后来计算最高位即可 那么转换成区间求和, 区间排序 区间排序的方式可以采用线段树维护最大递增块来解决,外层用set来维护线段树的 ...

  7. [LeetCode] 148. Sort List 链表排序

    Sort a linked list in O(n log n) time using constant space complexity. Example 1: Input: 4->2-> ...

  8. Sentinel: 接入控制台实时查看监控数据

    Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理.监控(单机和集群),规则管理和推送的功能. 比如我们之前是直接在代码中初始限流的值,接入控制台后可以直接通过控制台进行限流 ...

  9. Comet OJ - Contest #7 C 临时翻出来的题(容斥+状压)

    题意 https://www.cometoj.com/contest/52/problem/C?problem_id=2416 思路 这里提供一种容斥的写法(?好像网上没看到这种写法) 题目要求编号为 ...

  10. tomcat 指定(自定义)JDK路径的两种方式

      1.情景展示 tomcat7使用jdk1.7:tomcat8使用jdk1.8.两个tomcat在一台机器下同时启动,你会发现这两个tomcat使用的是一个版本的jdk, 那就是你配置过的JAVA_ ...