上传的HttpPostedFile为null

时间:2009-02-13 00:16:41

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

在视图上:

<% =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();
}
在About()中,

postedFile为空。如何上传文件?

12 个答案:

答案 0 :(得分:29)

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

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

你必须拥有方法头:

public ActionResult About(HttpPostedFileBase file1)

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:4)

我遇到了同样的问题:

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

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

祝你好运

的Stefan

答案 3 :(得分:4)

使用此

public ActionResult Upload(HttpPostedFileBase excelfile)

更改HttpPostedFile

HttpPostedFileBase

答案 4 :(得分:3)

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

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

答案 5 :(得分:2)

我也有<%= 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" />

<%
}

%GT;

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

答案 6 :(得分:2)

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

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

答案 7 :(得分:2)

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

答案 8 :(得分:2)

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

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

答案 9 :(得分:1)

此外,我发现文件上传所在的表单声明必须始终具有

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

答案 10 :(得分:1)

以下是上传文件所需的所有内容

//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" />
}

答案 11 :(得分:0)

encType="multipart/form-data"

<?php class ScriptSoapClient extends SoapClient { public function __doRequest($request,$location,$action,$version,$one_way=0) { $response=parent::__doRequest($request,$location,$action,$version,$one_way); $response=preg_replace('#^.*(<\?xml.*>)[^>]*$#s','$1',$response); return $response; } } // | is used as splitting char for arrays function runService() { //global $KERNELURL; $KERNELURL="127.0.0.1:8282/axis2/services/MiddleService?wsdl"; $num=func_num_args(); if ($num < 2) return; $service=new ScriptSoapClient(null, array("location"=> $KERNELURL,"uri"=>"http://ws.apache.org/axis2","trace"=>true)); $p[0]=new SoapParam((string)func_get_arg(0),"p1"); $p[1]=new SoapParam((string)func_get_arg(1),"p2"); for ($i=2; $i < $num-1;$i++) { $param=func_get_arg($i); if (is_array($param)) { $data="||ARR||".implode("|",$param); } else { $data=$param; } $p[$i]=new SoapParam((string)$data,"p3"); } $p[$num-1]=new SoapParam((string)func_get_arg($num-1),"p4"); try { $result=$service->__soapCall("run",$p); } catch (SoapFault $e) { echo $e; return "error"; } unset($service); if (is_array($result)) { return $result["return"]; } else { return $result; } } $res2=runService("Service_addCostume","addCostume","costum1"); ?> 添加到表单中。