如何在vNext下的MVC 6中上传文件?

时间:2014-10-18 18:47:42

标签: asp.net-core asp.net-core-mvc

在MVC 5中,我曾经这样做过:

var context = (HttpContextBase)Request.Properties["MS_HttpContext"];
var file = (HttpPostedFileBase)context.Request.Files[0];

现在这些在vCxt下的MVC 6中不可用。如何从请求中获取文件?

4 个答案:

答案 0 :(得分:8)

以下答案是关于beta6版本的。

它现在在框架中。 到目前为止,有一些警告,要获取上传的文件名,您必须解析标题。而且你必须在你的控制器中注入IHostingEnvironment才能到达wwwroot文件夹位置,因为没有更多的Server.MapPath()

以此为例:

public class SomeController : Controller
{

    private readonly IHostingEnvironment _environment;

    public SomeController(IHostingEnvironment environment)
    {       
        _environment = environment;
    }

    [HttpPost]
    public ActionResult UploadFile(IFormFile file)//, int Id, string Title)
    {

        if (file.Length > 0)
        {
            var targetDirectory = Path.Combine(_environment.WebRootPath, string.Format("Content\\Uploaded\\"));
            var fileName = GetFileName(file);
            var savePath = Path.Combine(targetDirectory, fileName);

            file.SaveAs(savePath);
            return Json(new { Status = "Ok" });
        }
        return Json(new { Status = "Error" });
    }

    private static string GetFileName(IFormFile file) => file.ContentDisposition.Split(';')
                                                                .Select(x => x.Trim())
                                                                .Where(x => x.StartsWith("filename="))
                                                                .Select(x => x.Substring(9).Trim('"'))
                                                                .First();

}

答案 1 :(得分:6)

尚未在MVC6中实现FileUpload,see this issue以及状态等this one等相关问题。

您可以从JavaScript发布XMLHttpRequest并使用类似代码的内容进行捕获:

public async Task<IActionResult> UploadFile()
{
    Stream bodyStream = Context.Request.Body;

    using(FileStream fileStream = File.Create(string.Format(@"C:\{0}", fileName)))
    {

        await bodyStream.CopyToAsync(fileStream);

    }

  return new HttpStatusCodeResult(200);
}

编辑:如果您看到问题已关联,则现已关闭。您现在可以使用更常规的方式在MVC6中上传文件。

答案 2 :(得分:6)

答案 3 :(得分:3)

在ASP.NET Core 1.0(MVC 6)中上传文件的最简单方法
查看(cshtml):

<form method="post" asp-action="Upload" asp-controller="Home" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" value="upload"/>
</form>

控制器(cs):

[HttpPost]
public IActionResult Upload(IFormFile file)
{
    if (file == null || file.Length == 0)
        throw new Exception("file should not be null");

    // RC1
    // var originalFileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');    
    // file.SaveAs("your_file_full_address");

   // RC2
   using (var fileStream = new FileStream("path_address", FileMode.Create))
   {
       await file.CopyTo(fileStream);
   }
}