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

18 浏览
0 Comments

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

我正在尝试在MVC中创建一个电影库,并且我有以下算法:

1. 将图像保存到服务器的特定文件夹中。`Path.Combine(Server.MapPath("~/Images"), Path.GetFileName(archivo.FileName));`

2. 将图像名称保存到数据库中(不是完整路径,只是像Hello.jpg这样)。

3. 在视图中,使用foreach循环,通过输入``来显示它们。

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

这是我的代码:

控制器:

[HttpPost]
public ActionResult Peliculas_Agregar(pelicula pelis) {
    string path="";
    HttpPostedFileBase archivo = Request.Files["Imagen"];
    if (ModelState.IsValid) {
        try {
            if (archivo != null && archivo.ContentLength > 0) {
                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);
}

模型(由Entity Framework生成):

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 duracion { get; set; }
public string categoria { get; set; }
[DataType(DataType.Upload)]
[Display(Name = "Cargar imagen")]
public string imagen { get; set; }

视图:

@using (Html.BeginForm("Peliculas_Agregar", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" })) {
    @Html.AntiForgeryToken()
    @Html.LabelFor(m => m.titulo, new { htmlAttributes = new { @for = "exampleTittle" } })
    @Html.EditorFor(m => m.titulo, new { htmlAttributes = new { @placeholder = "Título", @class = "form-control"} })
    
    
}

我的代码工作正常,但我面临的主要问题是,我无法或者不知道如何将图像名称保存到数据库中,因为我无法获取传入参数的图像名称字符串。我只是得到一个名为System.Web.HttpPostedFileWrapper的字符串或类型。我认为这是因为我使用HttpPostedFileBase将图像保存到服务器,但我无法编辑它并只保存图像名称到服务器。无法同时做这两件事。我该如何解决这个问题?

0
0 Comments

在ASP.NET MVC中如何将图片名称上传到数据库?

问题出现的原因是在上传图片时,需要将图片名称保存到数据库中。解决方法是通过使用View Model来接收表单和文件的数据,然后将View Model的字段映射到实体的字段,再进行数据库操作。

首先,定义一个实体模型Movie,包括Title和FileName两个属性。

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

然后创建一个View Model MovieVM,用于接收表单的值,其中包括Title和Image两个属性,Image属性使用HttpPostedFileBase类型来表示上传的图片文件。

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

在控制器中的上传操作方法UploadMovie中,接收MovieVM作为参数。如果ModelState.IsValid为true,即表单数据验证通过,则保存文件并将MovieVM中的字段映射到Movie实体中的对应字段,然后将Movie实体添加到数据库并保存更改。

[HttpPost]
public ActionResult UploadMovie(MovieVM model)
{
    if (ModelState.IsValid)
    {
        // 保存文件
        // ...
        // 将MovieVM字段映射到Movie实体并保存到数据库
        Movie movie = new Movie
        {
            Title = model.Title,
            FileName = model.Image.FileName
        };
        db.Movies.Add(movie);
        db.SaveChanges();
        return RedirectToAction("Success");
    }
    return View(model);
}

在这个示例中,使用View Model来接收表单的数据,并通过映射将View Model的字段值赋给实体对象的对应字段。通过这种方式,可以灵活地选择需要映射的字段,忽略不需要的字段,并进行字段的转换。保持字段名称的一致性可以方便开发人员进行字段映射操作。

参考链接:

1. [Upload image included in MVC model](https://stackoverflow.com/questions/20446580)

2. [What is ViewModel in MVC?](https://stackoverflow.com/questions/11064316)

0