asp.net-mvc-4 - 在 MVC4 文件中上传它在 DB 中保存的 "System.Web.HttpPostedFileWrapper"而不是文件名

标签 asp.net-mvc-4 c#-4.0 file-upload

我正在尝试使用 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/

相关文章:

oracle - 使用 EF4 将 Int32 转换为 Oracle number(5)

mysql - CakePHP 2.0 文件上传

javascript - 防止点击文件输入的标签打开文件浏览器

database - MVC4如何获取外键代表的值

c#-4.0 - 如何将现有 View 附加到 Controller 操作?

linq - Entity Framework Extended - 简单删除给我空引用

c# - 在单独的进程中从插件获取 WPF 应用程序中的 TextBox 焦点

javascript - 多个文件上传仅显示文件名

c# - 是什么原因导致 d :\drive to be unavailable in web app on Azure?

javascript - 在javascript中从 Controller MVC获取json