(此文章同时发表在本人微信公众号“dotNET每日精华文章”,欢迎右边二维码来关注。)

题记:在ASP.NET 5(MVC 6)中处理上传文件的方式和之前有所不同。

在MVC 5之前的版本中上传文件,有两种方式。

1,直接对Request.Files进行访问获取HttpPostedFileBase,如下面代码所示:

[HttpPost]
public ActionResult Upload()
{
string path = @"D:\Temp\"; HttpPostedFileBase photo = Request.Files["photo"]; if(photo != null)
photo.SaveAs(path + photo.FileName); return RedirectToAction("Index");
}

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } 2,通过模型绑定获取HttpPostedFileBase,如下面代码所示:

[HttpPost]
public ActionResult Upload(HttpPostedFileBase photo)
{
string path = @"D:\Temp\"; if(photo != null)
photo.SaveAs(path + photo.FileName); return RedirectToAction("Index");
}

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } 更多详细的用法可以参考CodeProject的这篇文章《Uploading and returning files in ASP.NET MVC》。

在MVC 6中同样也是有两种方式,只是提供的类和之前有所不同,没有HttpPostedFileBase,取而代之的是IFormFile,且额外的一些文件信息放到了ContentDispositionHeaderValue。

1,直接使用Request.Form.Files访问IFormFile,如下代码所示:

[HttpPost]
public ActionResult Upload()
{
string path = @"D:\Temp\"; IFormFile photo = Request.Form.Files["photo"]; if (photo != null)
{
var parsedContentDisposition = ContentDispositionHeaderValue.Parse(photo.ContentDisposition);
var originalName = parsedContentDisposition.FileName.Replace("\"", "");
photo.SaveAs(path + originalName);
} return RedirectToAction("Index");
}

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

大家可以注意到了,我对parsedContentDisposition.FileName进行了一个替换处理。这是因为FileName这个属性值会带有前后双引号。我不知道这个是个bug还是故意设计,过一会去提个Issue问问。

2,通过模型绑定获取IFormFile,如下面代码所示:

[HttpPost]
public ActionResult Upload(IFormFile photo)
{
string path = @"D:\Temp\"; if (photo != null)
{
var parsedContentDisposition = ContentDispositionHeaderValue.Parse(photo.ContentDisposition);
var originalName = parsedContentDisposition.FileName.Replace("\"", "");
photo.SaveAs(path + originalName);
} return RedirectToAction("Index");
}

另外,还需要注意的是,在MVC 6中已经无法用Server.MapPath这样的方法来得到虚拟地址对应的物理地址了,只能通过IHostingEnvironment.MapPath来获取(此方法是一个扩展方法)。而要使用IHostingEnvironment的实例,必须把其注入到Controller中(IHostingEnvironment是默认被系统注册的,无需也无法显式注册)。经过我的试验,只能通过构造器注入,而无法通过[Activate]来属性注入。

ASP.NET 5探险(2):上传文件的更多相关文章

  1. asp.net中FileUpload得到上传文件的完整路径

    asp.net中FileUpload得到上传文件的完整路径 Response.Write("完整路径:" + Server.MapPath(FileUpload1.PostedFi ...

  2. asp dotnet core 支持客户端上传文件

    本文告诉大家如何在 asp dotnet core 支持客户端上传文件 新建一个 asp dotnet core 程序,创建一个新的类,用于给客户端上传文件的信息 public class Kanaj ...

  3. ASP.NET MVC 4 批量上传文件

    上传文件的经典写法: <form id="uploadform" action="/Home/UploadFile" method="post& ...

  4. ASP.NET MVC 4 Ajax上传文件

    这两天一直纠结着表单的问题.想在一个表单里实现三个功能: 输入查询条件,点击查询: 导出查询数据: 上传文件: 方法有很多,乱花渐欲迷人眼,尝试了很多,无果.大致说的是,给不同按钮写js代码,在js代 ...

  5. asp.net 一般处理程序接收上传文件的问题

    在使用Html+ashx处理文件上传时,遇到上传文件超过4M的问题,首先HTML代码如下: <!DOCTYPE html> <html> <head> <me ...

  6. asp.net Mvc 使用uploadify 上传文件 HTTP 302 Error

    CSHTML代码 @{ if (Request.Cookies[FormsAuthentication.FormsCookieName] != null) { <input type=" ...

  7. ASP.NET Core MVC如何上传文件及处理大文件上传

    用文件模型绑定接口:IFormFile (小文件上传) 当你使用IFormFile接口来上传文件的时候,一定要注意,IFormFile会将一个Http请求中的所有文件都读取到服务器内存后,才会触发AS ...

  8. Asp.netMVC中Ajax.BeginForm上传文件

    做一个上传并解压的功能,解压完了回调,解压多少文件.搞了半天用Ajax.BeginForm.各种坑,后来直接放弃 @using (Ajax.BeginForm("UploadFile&quo ...

  9. asp.net FileUpload 控件上传文件 以二进制的形式存入数据库并将图片显示出来

    图片上传事件代码如下所示: byte[] binary = upload.FileBytes; StringBuilder sqlStrSb = new StringBuilder(); sqlStr ...

  10. asp.net 跨域服务器 上传文件

    最近一个项目遇到问题,公司局域网中,在F域下有个服务器Fa,我们的项目就部署在Fa.项目里面有个功能,需要把生成的文件(.doc,.xls,.pdf)保存到O域的一台文件共享服务器Ob.在原有的网络环 ...

随机推荐

  1. 获取编辑框字符串,传入Intent

    private EditText etData; etData = (EditText) findViewById(R.id.etData); Intent i = new Intent(MainAc ...

  2. python模块名和文件名冲突解决

    对于python初学者,很容易练习到一个随机数生成的程序,代码如下: #!/usr/bin/python import random print(random.randint(12,20)) 这个小程 ...

  3. cxGrid 速度

    在做AdoHelper实用程序的时候,我用了DevExpress的cxGrid控件.在此之前用的是dbgrid,考虑到不能把所有的数据都拉到本地,我用了动态生成的select top 500的命令.这 ...

  4. 22. javacript高级程序设计-高级技巧

    1. 高级技巧 1.1 函数 l 可以使用惰性载入函数,将任何分支推迟到第一个调用函数的时候 l 函数绑定可以让你创建始终在指定环境中运行的函数,同时函数柯里化可以让你创建已经填写了某些参数的函数 l ...

  5. 欧洲杯 2016 高清直播 - 观看工具 UEFA-EURO-2016-Play.7z

    OnlineTV-MPlayer-nocache.exe 占 CPU 内存 较少 OnlineTV-FFPlay.exe 可截取图像 UEFA-EURO-2016-Play-v5.7z UEFA-EU ...

  6. 比较两个mysql数据库表结构的差异

    需求来源:一个线上系统,一个开发系统,现在要把开发系统更新到线上,但是开发系统的数据库结构与线上的略有差异,所以需要找出两个数据库的表结构差异. 数据库表结构的差异 注:操作均在Linux系统下完成 ...

  7. centos6.5Xen4.2安装

    官方安装文档:http://xen.crc.id.au/support/guides/install/ 一.环境说明 1. 本文采用CentOS6.5 x64,安装开发包及开发工具. 2. 关闭sel ...

  8. linux下动态链接库解决方案(一)

    1.c++无法直接调用用c写的动态链接库,如果调用的话可能需要用到一些交叉编译的知识: 2.在c++写的动态链接库无法被调用成功的反思: 在linux下,通常都是使用g++编译器("g++ ...

  9. vs2010 快捷键大全

    vs2010 快捷键大全 VS2010版快捷键 Ctrl+E,D ----格式化全部代码 Ctrl+E,F ----格式化选中的代码 CTRL + SHIFT + B生成解决方案 CTRL + F7 ...

  10. js中Number对象与MATH方法整理总结

    W3C的文档: Number 对象属性 属性 描述 constructor 返回对创建此对象的 Number 函数的引用. MAX_VALUE 可表示的最大的数. MIN_VALUE 可表示的最小的数 ...