【问题标题】:Uploaded HttpPostedFile is null上传的 HttpPostedFile 为空
【发布时间】:2009-02-13 00:16:40
【问题描述】:

在视图上:

<% =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() 中为空。如何上传文件?

【问题讨论】:

  • 只是提醒遇到同样问题的其他人。这里的实际问题是enctype="multipart/form-data ",属性值末尾有一个空格,相信我,Firefox 会将其重置为默认编码类型。您不会在 chrome 中注意到它。我遇到了同样的问题,当我发现并删除了那个额外的空间时,一切都很顺利..!希望它会节省某人的几分钟..!

标签: c# asp.net asp.net-mvc


【解决方案1】:

使用 HttpPostedFileBase(不是 HttpPostedFile),并按照表格中的方式命名参数。例如。如果你有

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

你必须有方法头:

public ActionResult About(HttpPostedFileBase file1)

【讨论】:

  • 实际上只有名称是强制性的(并且必须符合方法参数名称)。 id 仅用于 javascript 和 css(简化)。
  • 我遇到了完全相同的问题,一旦将我的操作参数类型从HttpPostedFile 更改为HttpPostedFileBase,它就起作用了。所以应该强调这个建议。
  • 拯救了我的一天,这很有趣,是错误还是预期行为?
【解决方案2】:

这并不能回答为什么您的参数为空,但您可以直接深入研究请求。不过,这可能不是最“MVC”的方式。在你的方法体中试试这个:

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

为了更“MVC”,您可以将该代码从控制器中提取到 IModelBinder 实现中,并使用自定义对象作为方法的参数。这个Scott Hanselman blog post 显示了实现自定义模型绑定器的步骤。

【讨论】:

    【解决方案3】:

    使用这个

    public ActionResult Upload(HttpPostedFileBase excelfile)
    

    HttpPostedFile 更改为HttpPostedFileBase

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题:

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

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

      最好的问候

      斯蒂芬

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          我对@9​​87654321@ 也有一些怪癖。所以,我使用 using。同样,在控制器端,我只是从请求对象中获取我上传的文件。

          试试这个。它有效:

          <% 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");
              }
          

          【讨论】:

          • 只需复制并粘贴我的控制器操作和视图。这个对我有用。请注意,我的操作方法没有将 HttpPostedFile 作为参数。
          • FormCollection form 不需要。 Request.Files["PostedFile"]; 可以更改为Request.Files[0];。如果使用 Razor,您只需要在 using 之前添加一个 @ 并去掉所有 &lt;%%&gt; 标签。也可以将[AcceptVerbs(HttpVerbs.Post)] 更改为[HttpPost]。我让它与这些变化一起工作。
          【解决方案7】:

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

          但更重要的是,您正在运行的 MVC 版本取决于版本,您检索已发布文件的方式会有所不同。

          【讨论】:

            【解决方案8】:

            “multipart/form-data”后面的空格才是真正的问题...

            【讨论】:

              【解决方案9】:

              你在使用 jquery mobile 吗?如果是,则需要将 @data_ajax 设置为 false

              new { enctype = "multipart/form-data", @data_ajax = "false" }
              

              【讨论】:

                【解决方案10】:

                另外,我发现文件上传所在的表单声明必须总是有

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

                【讨论】:

                  【解决方案11】:

                  这是上传文件所需的全部内容

                  //in your model 
                  public partial class Profile
                  {
                      [DisplayName("Image Upload")]
                      [DataType(DataType.Upload)] 
                      public HttpPostedFileBase FileUpload { get; set; }
                  }
                  
                  
                  
                  // in your view
                  @model ProjName.Blabla.Profile
                  
                  @using (Html.BeginForm("Edit", "Profile", FormMethod.Post, new { enctype = "multipart/form-data" }))
                  {
                      <input type="file" name="FileUpload" id="FileUpload" value="Choose File" class="form-control" />
                  
                      <input type="submit" value="Save" class="btn btn-default" />
                  }
                  

                  【讨论】:

                    【解决方案12】:
                    <form id="Form1" method="post" encType="multipart/form-data" runat="server">
                    

                    encType="multipart/form-data" 添加到您的表单中。

                    【讨论】:

                      猜你喜欢
                      • 2012-01-02
                      • 2010-12-25
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-04-23
                      • 2019-09-07
                      • 2016-01-09
                      • 2010-11-12
                      • 1970-01-01
                      相关资源
                      最近更新 更多