将图像上传到目录并将图像名称写入数据库
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 ...
的 id
和 name
属性都已设置。
希望对您有所帮助!
编辑
您还可以将 null
和 null
作为 Html.BeginForm
方法的操作和控制器参数传递,如下所示:
@Html.BeginForm(null, null, FormMethod.Post, new { enctype="multipart/form-data"})
我正在使用 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 ...
的 id
和 name
属性都已设置。
希望对您有所帮助!
编辑
您还可以将 null
和 null
作为 Html.BeginForm
方法的操作和控制器参数传递,如下所示:
@Html.BeginForm(null, null, FormMethod.Post, new { enctype="multipart/form-data"})