[asp.net-mvc]将图像上传到目录和图像名称写入数据库

发布时间: 2017/3/25 2:44:25
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我使用的 ASP.NET MVC 4,我只将图像上传到目录和图像名称写入我的数据库;然而,文件名显示了 null,我就不设置到对象的实例的对象引用错误 HttpPostedFileBase 文件变量当它是我的控制器的 HttpPost create () 方法中的参数。

这里是模型中的文件名︰

public string ImageName { get; set; }

这是的视图︰

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Expense</legend>
<div class="editor-label">
            @Html.LabelFor(model => model.ImageName)
        </div>
        <div class="editor-field">
            <input type="file" name="file" />
        </div>


        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

这里是在控制器中 HttpPost create () 方法︰

[HttpPost]
        [ValidateAntiForgeryToken]
        [Authorize]
        public ActionResult Create(Expense expense, HttpPostedFileBase file)
        {
            if (ModelState.IsValid)
            {

                var fullName = db.UserProfiles.Where(u => u.UserId == expense.UserId).Select(n => n.FullName).ToArray()[0];

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

                var query =
                    from e in db.Expenses
                    where e.ExpenseId == expense.ExpenseId
                    select e;

                foreach (Expense exp in query)
                {
                    exp.ImageName = file.FileName;
                }

                db.Expenses.Add(expense);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            var errors = ModelState.Values.SelectMany(v => v.Errors);
            ViewBag.UserId = new SelectList(db.UserProfiles, "UserId", "UserName", expense.UserId);
            return View(expense);
        }

解决方法 1:

您将需要确保 enctype 的窗体设置为 "multipart/form-data" ,以便它将文件发送到控制器。

在你 @Html.BeginForm() 方法,您需要传递一些参数︰

@Html.BeginForm(action,
                controller,
                FormMethod.Post,
                new { enctype="multipart/form-data"}) // <-- Important for uploading files

其中 action 是您要发布到的操作的名称 ( "Create" ) 在这种情况下,和 controller 是行动上的控制器的名称 (不知道它在您的实例,但作为一个例子 "ExpenseController" )。

还有,我喜欢以确保 idname 的属性 <input ... 都设置。

希望这有助于 !

编辑
你也可以通过 nullnull 作为你行动和控制器参数的 Html.BeginForm 方法,像这样︰

@Html.BeginForm(null, null, FormMethod.Post, new { enctype="multipart/form-data"})
官方微信
官方QQ群
31647020