我正在尝试使用 MVC4 进行文件上传,但它在数据库中保存对象名称为“System.Web.HttpPostedFileWrapper”而不是文件名,即“Songs.MP3”,文件也不会传输到给定位置。
模型
public class FileUpload
{
[Key]
public int FileUploadID { get; set; }
public int AlbumID { get; set; }
public string FileType { get; set; }
public string FileUploadLocation { get; set; }
public virtual Albums Albums { get; set; }
}
看法
@using (Html.BeginForm("Create", "FileUpload", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<div class="editor-label">
@Html.LabelFor(model => model.FileUploadLocation)
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.FileUploadLocation, new { type = "file", accept = "FileUploadLocation/*" })
@Html.ValidationMessageFor(model => model.FileUploadLocation)
</div>
Controller
//
// POST: /FileUpload/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(FileUpload fileupload, HttpPostedFileBase FileUploadLocation)
{
if (ModelState.IsValid)
{
var fileName = Path.GetFileName(FileUploadLocation.FileName);
var path = Path.Combine(Server.MapPath("~/Images/Files"), fileName);
FileUploadLocation.SaveAs(path);
db.FileUploads.Add(fileupload);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.AlbumID = new SelectList(db.Albumss, "AlbumID", "AlbumTitle", fileupload.AlbumID);
return View(fileupload);
}
文件在 ~/Images/Files 位置不可用。
最佳答案
这里的问题很少。第一个问题是命名约定。您的 FileUpload 模型具有属性 FileUploadLocation
作为字符串,在 Controller 中的 Create 方法中,您正在传递 FileUpload fileupload
模型和 HttpPostedFileBase FileUploadLocation
.
另一个更重要的问题是您不应该将 View Model 保存到数据库中,它应该映射到某种域对象,然后将被保存。例如:
创建新的 View 模型:
public class FileUploadViewModel
{
public int FileUploadID { get; set; }
public int AlbumID { get; set; }
public string FileType { get; set; }
public HttpPostedFileBase FileUploadFile { get; set; }
public virtual Albums Albums { get; set; }
}
从域模型中删除虚拟方法:
public class FileUpload
{
[Key]
public int FileUploadID { get; set; }
public int AlbumID { get; set; }
public string FileType { get; set; }
public string FileUploadLocation { get; set; }
}
然后你的 Controller Create 方法应该是这样的:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(FileUploadViewModel model)
{
if (ModelState.IsValid)
{
var fileName = Path.GetFileName(model.FileUploadFile.FileName);
var path = Path.Combine(Server.MapPath("~/Images/Files"), fileName);
model.FileUploadFile.SaveAs(path);
db.FileUploads.Add(new FileUpload
{
FileUploadID = model.FileUploadID,
AlbumID = model.AlbumID,
FileType = model.FileType,
FileUploadLocation = path
});
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.AlbumID = new SelectList(db.Albumss, "AlbumID", "AlbumTitle", model.AlbumID);
return View(model);
}
关于asp.net-mvc-4 - 在 MVC4 文件中上传它在 DB 中保存的 "System.Web.HttpPostedFileWrapper"而不是文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20833479/