题 上传的HttpPostedFile为null


在视图上:

<% =Html.BeginForm("About", "Home", FormMethod.Post, new {enctype="multipart/form-data "})%>
  <input type="file" name="postedFile" />
  <input type="submit" name="upload" value="Upload" />
<% Html.EndForm(); %>

在Controller中,有这样的东西:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult About(HttpPostedFile postedFile)
{
    //but postedFile is null 
    View();
}

postedFile 在About()中为null。我如何上传文件?


16
2018-02-13 00:16


起源


查看 Scott Hansleman的博客文章 - Matthew
只是注意到遇到同样问题的其他人。这里的实际问题是 enctype="multipart/form-data " 在属性值的末尾有一个空格并相信我,Firefox会将其重置为默认的enctype。你不会在chrome中注意到它。我遇到了同样的问题,当我发现并删除了额外的空间时,一切都很顺利......!希望它能节省一些人的几分钟......! - Mat J


答案:


使用HttpPostedFileBase(不是HttpPostedFile)并将参数命名为与表单完全相同。例如。如果你有

<input type="file" id="file1" name="file1" />

你必须有方法头:

public ActionResult About(HttpPostedFileBase file1)

27
2017-07-13 12:29



id和name需要一样吗? - Matt Kocaj
实际上只有名称是必需的(并且必须符合方法参数名称)。 id仅由javascript和css(简化)使用。 - Carl Hörberg
我有完全相同的问题,一旦改变我的动作参数类型 HttpPostedFile 至 HttpPostedFileBase, 有效。所以应该强调这个建议。 - René
救了我的一天,这很有趣,是一个错误还是预期的行为? - Mohammad Sepahvand
就是这样。糟糕的设计? - Mandeep Janjua


这不能解释您的参数为空的原因,但您可以直接深入了解请求。尽管如此,这可能不是最“MVC”的方式。在你的方法体中试试这个:

var upload = Request.Files["postedFile"]
if (upload.ContentLength > 0)
{
  // Do whatever
}

要成为更“MVC”,您可以将代码从控制器中提取到IModelBinder实现中,并使用自定义对象作为方法的参数。这个 Scott Hanselman博客文章 显示了实现自定义ModelBinder的步骤。


7
2018-02-13 00:51





我有同样的问题:

您必须为input元素定义名称和ID:

<input type="file" name="postedFile" id="postedFileId"  /> 

最好的祝福

斯特凡


4
2018-06-05 06:44





您应该从enctype属性的末尾删除空格:

new {enctype="multipart/form-data "} => new {enctype="multipart/form-data"}

3
2018-06-04 17:35





我也有一些怪癖 <%= Html.BeginForm ...%>。所以,我使用的是。再次,在Controller端,我只是从请求对象中获取我上传的文件。

尝试这个。有用:

<% using (Html.BeginForm("Post", "Home", FormMethod.Post, new {enctype = "multipart/form-data"}))
   {%>

    <input type="file" id="postedFile" name="PostedFile" />
    <input type="submit" />

<%
}

%>

[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Post(FormCollection form)
    {
      HttpPostedFileBase postedFile =   Request.Files["PostedFile"];
        return RedirectToAction("Index");
    }

2
2018-02-13 01:22



postedFile仍然为null
只需复制并粘贴我的控制器操作和视图即可。这个对我有用。请注意,我的action方法没有将HttpPostedFile作为参数。 - Pita.O
FormCollection form 不需要。 Request.Files["PostedFile"]; 可以改为 Request.Files[0];。如果使用Razor,你只需要一个 @ 之前 using 并摆脱所有的 <% 和 %> 标签。可以换 [AcceptVerbs(HttpVerbs.Post)] 至 [HttpPost]也是。我得到了这些变化。 - vapcguy


您使用的是哪个版本的MVC? 现在我和RC候选人一起尝试使用HttpPostedFile,我得到了“没有空白的构造函数错误”。我不得不使用HttpPostedFileBase。

更重要的是,您运行的MVC的版本,取决于版本,您检索发布的文件将如何不同。


2
2018-02-20 18:31





“multipart / form-data”之后的空白空间是真正的问题......


2
2017-07-05 12:54