如何使用ASP.NET MVC将图像名称上传到数据库?

时间:2019-05-09 17:54:04

标签: c# asp.net-mvc

我正在尝试在 MVC 中制作电影库,并且具有以下算法:

  1. 将图像保存到服务器的特定文件夹中。 Path.Combine(Server.MapPath("~/Images"), Path.GetFileName(archivo.FileName));
  2. 然后将图像名称保存到数据库。 (不是完整路径,就像 Hello.jpg )。
  3. 视图中,只需使用foreach循环输入<img src="/Images/@MovieGallery.Imagen"/>即可显示它们。

(如果我的算法不好,请纠正我)

这是我的代码:

控制器

        [HttpPost]
    public ActionResult Peliculas_Agregar(pelicula pelis)  {

        string path="";
        HttpPostedFileBase archivo = Request.Files["Imagen"]; // @name= file, capturo el name


            if (ModelState.IsValid) { // Validar si son validos los campos segun DBSET
                    try
                    {

                        if (archivo != null && archivo.ContentLength > 0) { //El nombre del archivo debe ser mayor que 0 y no debe ser nulo
                            try
                            {
                                path = Path.Combine(Server.MapPath("~/Images"), Path.GetFileName(archivo.FileName));
                                archivo.SaveAs(path);

                    }
                    catch (Exception ex) {
                                ViewBag.ErrorArchivo = ex;
                            }
                        }

                        Cine.peliculas.Add(pelis);
                        Cine.SaveChanges();
                    }
                catch (Exception ex){
                        ViewBag.Error = ex;
                    }

            }
        return View(pelis);
    }

模型(由实体框架生成)

 public int id_peli { get; set; }
    public string titulo { get; set; }
    public string director { get; set; }
    public string cast { get; set; }
    public string descripcion { get; set; }
    public Nullable<int> duracion { get; set; }
    public string categoria { get; set; }
    [DataType(DataType.Upload)]
    [Display(Name = "Cargar imagen")]
    //[Required(ErrorMessage = "Por favor carga una imagen")]
    public string imagen { get; set; } // here is where i want to save files name, not the path.

查看

@using (Html.BeginForm("Peliculas_Agregar", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()
    <div class="Formas">
        <div class="form-group">
            @Html.LabelFor(m => m.titulo, new { htmlAttributes = new { @for = "exampleTittle" } })
            @Html.EditorFor(m => m.titulo, new { htmlAttributes = new { @placeholder = "Título", @class = "form-control"} })
        </div>
        <div class="form-group">
            <input type="file" name="Imagen" />
        </div>
    </div>
    <input type="submit" value="Agregar Película" class="btn btn-outline-primary" />
}

我的代码工作确定,但是我面临的主要问题是我不能或不知道如何将图像名称保存到数据库 我没有得到要输入参数的图像的字符串名称。我只是得到一个像 System.Web.HttpPostedFileWrapper 这样的字符串或类型: System.Web.HttpPostedFileWrapper

我认为这是因为我正在使用 HttpPostedFileBase 将图像保存到服务器中,但是我无法进行编辑,仅将图像名称保存到服务器中。不能同时做两件事。我该怎么解决?

1 个答案:

答案 0 :(得分:0)

在两个喜欢的答案之后,我们使用视图模型发布表单和文件。然后,在执行数据库操作之前,我们将VM字段映射到Entity的字段。

实体模型

public class Movie
{
    public string Title { get; set; }
    public string FileName { get; set; }
}

创建一个视图模型以捕获您的表单值

public class MovieVM
{
    public string Title { get; set; }

    [Display(Name = "Upload Image")]
    public HttpPostedFileBase Image { get; set; }
}

该操作接受MovieVM而不是实体

[HttpPost]
public ActionResult UploadMovie(MovieVM model)
{
    if (ModelState.IsValid)
    {
        // save file
        // ...

        // Map to Entity to save to db
        Movie movie = new Movie
        {
            Title = model.Title,
            FileName = model.Image.FileName
        };

        db.Movies.Add(movie);
        db.SaveChanges();

        return RedirectToAction("Success");
    }
    return View(model);
}
  1. Upload image included in MVC model
  2. What is ViewModel in MVC?