zoukankan      html  css  js  c++  java
  • 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]来属性注入。

  • 相关阅读:
    虚函数和纯虚函数
    MS CRM 2011中PartyList类型字段的实例化
    MS CRM 2011的自定义与开发(12)——表单脚本扩展开发(4)
    MS CRM 2011的自定义与开发(12)——表单脚本扩展开发(2)
    MS CRM 2011的自定义和开发(10)——CRM web服务介绍(第二部分)——IOrganizationService(二)
    MS CRM 2011 SDK 5.08已经发布
    MS CRM 2011 Q2的一些更新
    最近很忙
    Microsoft Dynamics CRM 2011最近的一些更新
    补一篇,Update Rollup 12 终于发布了
  • 原文地址:https://www.cnblogs.com/redmoon/p/4601133.html
Copyright © 2011-2022 走看看