ASP.NET 5探险(2):上传文件
(此文章同时发表在本人微信公众号“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"); }
2,通过模型绑定获取HttpPostedFileBase,如下面代码所示:
[HttpPost] public ActionResult Upload(HttpPostedFileBase photo) { string path = @"D:\Temp\"; if(photo != null) photo.SaveAs(path + photo.FileName); return RedirectToAction("Index"); }
更多详细的用法可以参考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"); }
大家可以注意到了,我对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]来属性注入。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器