ASP.NET Core MVC上传文件

摘要:
FileName属性应仅用于显示目的。将IHostingEnvironment注入控制器的构造函数以获取网站的根目录路径:upload方法:1publicIActionResultUploadFiles2{3longsize=0;//文件大小4foreach5{6varfileName=file.FileName.Trim(“”);//获取文件名7fileName=_hostingEnv.WebRootPath+$@“{FileName}“;//指定文件上载路径8size+=file.Length;9使用//创建文件流10{11file.CopyTo;//将上载文件的内容复制到目标流12fs.Flush();//清除此流的缓冲区,并将所有缓冲区数据写入13}14}15ViewBag。Message=$”{files.Count}个文件/{size}个字节以成功上载!“;16returnView;17}使用IFormFile技术上载的文件将在处理之前缓存在内存或Web服务器的磁盘上。在操作方法中,IFormFile内容可以作为流访问。

使用模型绑定上传小文件

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     <div class="form-group">
9         <div class="col-md-10">
10              <input type="submit"value="上传">
11         </div>
12     </div>
13 </form>
14 @ViewBag.Message

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

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

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

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

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

1 public interfaceIFormFile
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     voidCopyTo(Stream target);
11     Task CopyToAsync(Stream target, CancellationToken cancellationToken = null);
12 }

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

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

ASP.NET Core MVC上传文件第1张

上传方法:

1 public IActionResult UploadFiles(List<IFormFile>files)
2 {
3     long size = 0;//文件大小
4     foreach (var file infiles)
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 }

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

运行结果:

ASP.NET Core MVC上传文件第2张

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

ASP.NET Core MVC上传文件第3张

上传成功!

以上上传功能使用表单提交,以下代码扩展使用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 publicIActionResult UploadFiles()
2 {
3    long size = 0;//文件大小
4    var files = Request.Form.Files;//获取前端传过来的文件
5    foreach (var file infiles)
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 }

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

End!

免责声明:文章转载自《ASP.NET Core MVC上传文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇机器人程序员正在朝我们走来,大家准备好了吗?vuex的使用,vuex辅助函数、muduld的详解(文章下边)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

微信小程序基于腾讯云对象存储的图片上传

在使用腾讯云对象存储之前,公司一直使用的是传统的FTP的上传模式,而随着用户量的不断增加,FTP所暴露出来的问题也越来越多,1.传输效率低,上传速度慢。2.时常有上传其他文件来攻击服务器,安全上得不到保障。所以我们在经过慎重考虑觉得使用第三方的云存储服务。 在最开始的时候我们在腾讯云与阿里云中选择,最终我们选择腾讯云,腾讯云在文件上传用时方面的性能比较突出...

解决autocomplete=off在Chrome中不起作用的方法

大家都知道autocomplete属性是表单字段中的HTML5新属性,该属性有两种状态值,分别为"on" 和 "off",该属性可省略:省略属性值后默认值为"on",也可以省略属性名,直接写入关键字on或off。 网站项目中,有登录和注册的弹框,在除chrome的浏览器中一切都ok,一旦在谷歌浏览器中,问题来了:首先从登录弹框中登陆成功,chrome会弹出...

Echarts自动刷新数据

1.Echarts自动刷新数据 1.Echarts柱状图的正常配置 注:声明了 myChart、test这两个都有用 官方示例中myChart是声明在 function(ec)里面的 <script src="http://cdn.staticfile.org/jquery/2.1.1-rc2/jquery.min.js"></scri...

Ubuntu的cron日志在哪里?

Ubuntu 12.04使用rsyslog作为日志服务,默认cron日志记录是关闭的,需要开启后才能用。 打开/etc/rsyslog.d/50-default.conf,找到下面的行: # # First some standard log files. Log by facility. # auth,authpriv.* /va...

微信小程序,时间戳和日期格式互相转化

微信小程序,时间戳转为日期格式  通常后台传递过来的都是时间戳,但是前台展示不能展示时间戳。就需要转化了。 功能说明: 微信小程序里,时间戳转化为日期格式,支持自定义、 拷贝至项目utils/utils.js中,并注意在js中声明下; module.exports = { formatTime: formatTime, // 日期转时间戳...

Swift实战-小QQ(第1章):QQ登录界面

1.新建小QQ项目 2.将所需用到的图片资源(resource)文件夹,添加到项目中.并新建一个登录页面:LoginViewController.swift 3.修改LoginViewController.swift代码为 import UIKit class LoginViewController: UIViewController {...