ASP.NET 5 :上传文件(转)

(此文章同时发表在本人微信公众号“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]来属性注入。

时间: 2024-10-12 20:38:36

ASP.NET 5 :上传文件(转)的相关文章

asp.net 客户端上传文件全路径获取方法

asp.net  获取客户端上传文件全路径方法: eg:F:\test\1.doc 基于浏览器安全问题,浏览器将屏蔽获取客户端文件全路径的方法,只能获取到文件的文件名,如果需要获取全路径则需要另想其他方法 如下提供两种方法: 方法1:工具 -> Internet选项 -> 安全 -> 自定义级别 -> 找到“其他”中的“将本地文件上载至服务器时包含本地目录路径”,选中“启用”即可. 方法2: function getPath() { //获取file 控件对象 var obj =

ASP.NET MVC上传文件

出处:http://www.cnblogs.com/zhouhb/p/3906714.html 最近参考网络资料,学习了ASP.NET MVC如何上传文件.最基本的,没有用jQuery等技术. 1.定义Model public class TestModel    {        [Display(Name = "标题")]        [Required]        public string Title        {            get;           

asp.net FileUpload上传文件夹并检测所有子文件

1.在FileUpload控件添加一个属性 webkitdirectory=""就可以上传文件夹了 <asp:FileUpload ID="FileUpload1" runat="server" webkitdirectory="" /> 2.检测文件夹下所有子文件 string DirectoryName = FileUpload1.PostedFile.FileName; string path = Serve

ASP.NET Uploadify 上传文件过大报错

Uploadify上传文件原来很早之前用过,没发现什么问题.今天再使用过程中,当文件大于30M的时候就会报错404.查看错误消息提示配置最大上传太小了.需要修改. 记得原来配置上传文件大小在这里:<httpRuntime maxRequestLength="2097100" executionTimeout="3600"/> 配置即可.可是当我这里修改了之后发现还是错误.就想是不是上传控件本身有限制,看到我的有limitSize:30 已经设置了大小,但

ASP.NET总结——上传文件

在利用Html中的File控件上传文件时,如何获得你上传的文件的路径?北大青鸟的视频中告诉我们用: File1.PostedFile.FileName 可是在断点调试中,我就发现了问题. 在火狐浏览器和IETester中,都只显示文件名,而不显示文件的完整路径,获得的FileName也只是文件名.比如我选择的图片的完整路径是"E:\提高班课程实践篇(我)\images\niunanlogo.jpg",但是浏览器中显示的是"niunanlogo.jpg" ,而且调试中

ASP.NET MVC 上传文件

1.首先创建一控制器文件UpFileController.cs: using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc; namespace Mvc4Study.Controllers{ public class UpFileController : Controller { // // GET: /UpFile/ public ActionRes

ASP.net 判断上传文件类型的三种方法

一. 安全性比较低,把文本文件1.txt改成1.jpg照样可以上传,但其实现方法容易理解,实现也简单,所以网上很多还是采取这种方法. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 Boolean fileOk = false;           string path = Server.MapPath("~/images

asp.net uploadfile 上传文件,连接已重置问题

修改web.config中的配置 <httpRuntime maxRequestLength="102400" executionTimeout="6000"/> //设置上传文件大小(kb)和响应时间(s) 针对iis7或更高版本另需要在<configuration>标签下添加 <system.webServer> <security> <requestFiltering> <requestLimi

ASP.Net 5 上传文件通过虚拟路径存储

先贴上代码 [HttpPost] public IActionResult ImportTeaching(IFormFile file) { string root = @"Temp/teachingfile/"; string phyPayh = evn.MapPath(root); if (file != null) { var parsedContentDisposition = ContentDispositionHeaderValue.Parse(file.ContentDi

上传文件时的后台处理

asp.net core 上传文件controller保存 long size = 0; var files = Request.Form.Files; if (0 == Request.Form.Files.Count()) return Json("NoPicture"); foreach (var file in files) { var filename = ContentDispositionHeaderValue .Parse(file.ContentDisposition