将图像上传到目录并将图像名称写入数据库

Uploading Image to Directory and Writing Image Name to Database

我正在使用 ASP.NET MVC 4,我正在尝试将图像上传到目录并将图像名称写入我的数据库;但是,文件名显示为空,当 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>
}

这里是Controller中的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);
        }

您需要确保表单的 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").

此外,我想确保 <input ...idname 属性都已设置。

希望对您有所帮助!

编辑
您还可以将 nullnull 作为 Html.BeginForm 方法的操作和控制器参数传递,如下所示:

@Html.BeginForm(null, null, FormMethod.Post, new { enctype="multipart/form-data"})