MVC 4 Razor文件上传


249

我是MVC 4的新手,正在尝试在我的网站中实施文件上传控制。我找不到错误。我的文件中出现空值。

控制器:

public class UploadController : BaseController
    {
        public ActionResult UploadDocument()
        {
            return View();
        }

       [HttpPost]
       public ActionResult Upload(HttpPostedFileBase file)
       {
           if (file != null && file.ContentLength > 0)
           {
               var fileName = Path.GetFileName(file.FileName);
               var path = Path.Combine(Server.MapPath("~/Images/"), fileName);
               file.SaveAs(path);
           }

           return RedirectToAction("UploadDocument");
        }
    }

视图:

@using (Html.BeginForm("Upload", "Upload", FormMethod.Post, new { enctype = "multipart/form-data" }))
{ 
    <input type="file" name="FileUpload" />
    <input type="submit" name="Submit" id="Submit" value="Upload" />
}


1
您只需要更改公共ActionResult Upload(HttpPostedFileBase文件)<input type =“ file” name =“ FileUpload” />
Hafiz Asad


2
错过enctype表格花了我一个小时
Savage

Upload()方法和按钮之间的连接在哪里。应该有一个onClick事件吗?我是asp.net的新用户
pnizzle '18

Answers:


333

Upload方法的HttpPostedFileBase参数必须具有相同的名称的file input

因此,只需将输入更改为此:

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

另外,您可以在中找到文件Request.Files

[HttpPost]
public ActionResult Upload()
{
     if (Request.Files.Count > 0)
     {
         var file = Request.Files[0];

         if (file != null && file.ContentLength > 0)
         {
            var fileName = Path.GetFileName(file.FileName);
            var path = Path.Combine(Server.MapPath("~/Images/"), fileName);
            file.SaveAs(path);
         }
     }

     return RedirectToAction("UploadDocument");
 }

2
Index out of bounds万一Request.Files集合中没有文件,不会通过异常吗?
shashwat 2014年

2
实际上它会抛出ArgumentOutOfRangeException,但是您是对的,我已更新
Cristi Pufu 2014年

2
请记住,Html.BeginForm的参数是操作名称和控制器名称(不带“ controller”后缀。例如:Home而不是HomeController)。另一个重要的事情是不要在其中包含<form>标记,因为是打开该标记的
BeginForm

5
换句话说-您的视图模型属性名称必须与输入类型名称的属性名称匹配。如果您的viewmodel财产被命名,AgentPhoto那么您的视图中必须包含以下内容:<input type="file" name="AgentPhoto"/>
Dayan 2014年

var path = Path.Combine(Server.MapPath("~/Images/"), fileName);,找不到“服务器”类,使用哪个软件包?
DaniloPádua'15

65

澄清一下。模型:

public class ContactUsModel
{
    public string FirstName { get; set; }             
    public string LastName { get; set; }              
    public string Email { get; set; }                 
    public string Phone { get; set; }                 
    public HttpPostedFileBase attachment { get; set; }

动作后

public virtual ActionResult ContactUs(ContactUsModel Model)
{
 if (Model.attachment.HasFile())
 {
   //save the file

   //Send it as an attachment 
    Attachment messageAttachment = new Attachment(Model.attachment.InputStream,       Model.attachment.FileName);
  }
}

最后是检查hasFile的扩展方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace AtlanticCMS.Web.Common
{
     public static class ExtensionMethods 
     {
         public static bool HasFile(this HttpPostedFileBase file)
         {
             return file != null && file.ContentLength > 0;
         }        
     }
 }

公共HttpPostedFileBase附件{ 组; } /附件不是识别
Codeone

我认为可乐指的是未定义的附件类型。
卡森2015年

2
可以按照user2028367所述使用视图。实际上,我忘记在Html.BeginForm部分中包含新的{enctype =“ multipart / form-data”},因此无法在我的操作中查看文件。好答案。+1,用于在Model类和扩展方法中显示。
2016年

@BishoyHanna我如何在表格上加上附件。对于其他值,剃刀为我们提供了一种简单的语法,但是我如何对此文件进行处理?
Denis V

1
嗨,@ ClintEastwood,该帖子用于上传一个文件,我在网上搜索了与多个上传(适合您)相匹配的内容,发现我认为可以的一个。再次,这是不使用“Request.Files”的基于模型的 stackoverflow.com/questions/36210413/...
Bishoy汉娜

17

查看页面

@using (Html.BeginForm("ActionmethodName", "ControllerName", FormMethod.Post, new { id = "formid" }))
 { 
   <input type="file" name="file" />
   <input type="submit" value="Upload" class="save" id="btnid" />
 }

脚本文件

$(document).on("click", "#btnid", function (event) {
        event.preventDefault();
        var fileOptions = {
            success: res,
            dataType: "json"
        }
        $("#formid").ajaxSubmit(fileOptions);
    });

在控制器中

    [HttpPost]
    public ActionResult UploadFile(HttpPostedFileBase file)
    {

    }

2
我同意@Muflix,您不需要AJAX这里。Html.BeginForm已经做好了。仅当您不想重定向到<form action=LINK>
jAC

1
Ajax适用于较大的文件,因为它可以增强用户体验。
markthewizard1234年

6

您只需要更改输入字段的名称,因为参数中需要使用相同的名称,并且输入字段名称只需替换此行即可,您的代码可以正常工作

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

2

我认为,更好的方法是在控制器或API中使用HttpPostedFileBase。之后,您可以简单地检测大小,类型等。

您可以在这里找到文件属性:

MVC3如何检查HttpPostedFileBase是否为图像

例如ImageApi:

[HttpPost]
[Route("api/image")]  
public ActionResult Index(HttpPostedFileBase file)  
{  
    if (file != null && file.ContentLength > 0)  
        try 
        {  
            string path = Path.Combine(Server.MapPath("~/Images"),  
               Path.GetFileName(file.FileName));

            file.SaveAs(path);  
            ViewBag.Message = "Your message for success";  
        }  
        catch (Exception ex)  
        {  
            ViewBag.Message = "ERROR:" + ex.Message.ToString();  
        }  
    else 
    {  
        ViewBag.Message = "Please select file";  
    }  
    return View();  
}

希望对您有所帮助。


比什么更好?OP已在使用HttpPostedFileBase
jpaugh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.