简单文件上传返回NULL?

时间:2016-01-26 20:42:09

标签: c# asp.net-mvc

我试图在MVC 5中完成我的第一个简单文件上传。我跟随了一些我发现的例子,但出于某种原因,在我的"创建" ActionResult uploadFile总是以NULL形式进入,因此上传代码永远不会运行。有人看到我可能做错了吗?

@{
    ViewBag.Title = "Create";
    Layout = "~/Views/Shared/_Layout.cshtml";
}


<h2>Documents.</h2>
<h4>Upload a new document.</h4>

<div class="well">
@using (Html.BeginForm("Create", "Documents", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <h3>Select a file to upload. </h3>

    <input type="file" name="files" value="" multiple="multiple" />

    <input type="submit" value="Upload your file" title="Upload" />

    <div style="color:Red;font-size:14px">@ViewBag.Message</div>
}
</div>

这是我的控制器:

// POST: Documents/Create
        [HttpPost]
        public ActionResult Create(HttpPostedFileBase uploadFile)
        {
            try
            {
                if(uploadFile != null && uploadFile.ContentLength > 0)
                {

                    string filePath = Server.MapPath("../SiteDocuments" + uploadFile.FileName);

                    uploadFile.SaveAs(filePath);
                }

                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                return View();
            }

        }

1 个答案:

答案 0 :(得分:2)

您的文件输入元素的名称应与您的操作方法参数名称匹配。

因此,请更新HTML标记,使其具有相同的name属性值。

<input type="file" name="uploadFile" value="" multiple="multiple" />

,你的行动方法将是

[HttpPost]
public ActionResult Create(HttpPostedFileBase uploadFile)
{
  // do something
}

更改操作方法参数名称以匹配文件输入元素名称。

<input type="file" name="files" value="" multiple="multiple" />

,你的行动方法将是

[HttpPost]
public ActionResult Create(HttpPostedFileBase files)
{
    if(files!= null && files.ContentLength > 0)
    {
       // do something
    }
}

当您将multiple="multiple"属性添加到input元素时,浏览器将允许最终用户一次选择多个文件。在这种情况下,如果您的action方法参数是HttpPostedFileBase对象的单个实例,它将从选定的n文件接收第一个文件。如果您想要所有文件,可以将参数更改为集合,例如

[HttpPost]
public ActionResult Create(IEnumerable<HttpPostedFileBase> files)
{
    if (files != null && files.Any())
    {
        foreach (var file in files)
        {
            if (file.ContentLength > 0)
            {
                //do something
            }
        }
    }
}