尝试使用ASP.NET MVC上传文件

时间:2009-04-05 05:32:27

标签: asp.net-mvc file-upload

我正在尝试使用ASP.NET MVC上传文件。

以下代码完美无缺:

// Read in the image data.
byte[] binaryData = null;
HttpPostedFileBase uploadedFile = Request.Files["ImageFileName"];
if (uploadedFile != null &&
    uploadedFile.ContentLength > 0)
    {
        binaryData = new byte[uploadedFile.ContentLength];
        uploadedFile.InputStream.Read(binaryData, 
                                      0,
                                      uploadedFile.ContentLength);
    }

但我要做的是使用期货程序集中的新FileCollectionModelBinder

我发现这两篇博文herehere解释了该怎么做。我遵循这些说明,但没有任何运气 - > file对象始终为null

这是我的方法。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Include = "Subject, Content")]
                           Post post, 
                           HttpPostedFileBase file)
{
    UpdateModel(post);
    ...
}

注意我是如何上传文件并将一些帖子信息上传到Post对象的。

有人可以提出任何建议吗?

为了记录,我在global.asax.cs中连接了ModelBinder。我还确保该表单是添加了enctype的帖子: -

<form method="post" enctype="multipart/form-data" action="/post/create">

4 个答案:

答案 0 :(得分:10)

没有血腥的方式:(

我想出了答案而且非常蹩脚。

我必须让参数 NAME 与输入type =“file”元素的Id / Name值相同! (不确定它是否是元素值中的任何一个或两个......我没有检查出来)。

所以这就是答案。

Html输入元素。 (注意Id / Name的值)

<input type="file" id="imageFileName" name="imageFileName" class="upload" />

控制器方法

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Include = "Subject, Content")]Post post,
    HttpPostedFileBase imageFileName)
{
...
}

shees!

答案 1 :(得分:5)

请记住,您还需要打开这样的表单:

<form enctype="multipart/form-data" ...

答案 2 :(得分:1)

不确定这是否与问题相关,但我刚刚找到了一种方法来获取HttpPostedFileBase在复杂对象中的模型绑定。不幸的是,我不得不对ASP.NET MVC源代码进行更改,因此不适合所有人。

在System.Web.Mvc.ValueProviderDictionary.PopulateDictionary()中,值提供程序正在填充Request.Form,Request.QueryString和RouteData的内容 - 但不是Request.Files。添加以下行来“修复”这个(我说“修复”,因为ASP.NET MVC团队可能首先没有这样做)。

HttpFileCollectionBase files = ControllerContext.HttpContext.Request.Files;
if (files != null)
{
    string[] keys = files.AllKeys;
    foreach (string key in keys)
    {
        HttpPostedFileBase file = files[key];
        ValueProviderResult result = new ValueProviderResult(file, file.FileName, currentCulture);
        AddToDictionaryIfNotPresent(key, result);
    }
}

答案 3 :(得分:0)

在过去的一周里,我一直在为我的MVC项目构建一个上传/文件管理器系统,我最初的尝试是发布带有多部分文件值的其他帖子数据。这对我的时间限制来说太难了。我现在的方法是创建文件/图像可以“附加”的“相应记录”(就像我的情况一样),然后在记录存在后上传('附加')文件/图像。< / p>

例如:1)创建事件记录,2)附加上传控件的图像

我收到多部分帖子的操作使用Hanselman's post中的概念。

我不能说我已经尝试过对文件的内置复杂类型绑定(HttpPostedFileBase)但是我建议它比我现在的解决方案更复杂,因为阅读Hanselman上面写的帖子 - 我'我们了解到Request中返回的文件集只是一个松散类型的集合。

我建议您坚持使用原始代码并尝试为您的目的更加安全。