【问题标题】:Display image file from database using Entities Asp Net MVC C#使用实体 Asp Net MVC C# 显示数据库中的图像文件
【发布时间】:2016-04-19 13:06:02
【问题描述】:

我知道这不是一个新问题,但我查看了所有相关主题,但找不到我的答案。 我的问题是我已将图像数据存储到 sql db 中,但无法在编辑或索引(MVC 5)上显示它们。你能帮帮我吗,在此先感谢。 这是我的代码:

控制器

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "DrvId,FullName,Address,Postcode,Contact,Email,County,File,Date")] DriverReg driverReg, HttpPostedFileBase[] files)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    /*Lopp for multiple files*/
                    foreach (HttpPostedFileBase file in files)
                    {
                        /*Geting the file name*/
                        string filename = System.IO.Path.GetFileName(file.FileName);
                        /*Saving the file in server folder*/
                        file.SaveAs(Server.MapPath("~/Content/UploadedFiles/" + filename));
                        string filepathtosave = "UploadedFiles/" + filename;
                        /*HERE WILL BE YOUR CODE TO SAVE THE FILE DETAIL IN DATA BASE*/
                    }

                    ViewBag.Message = "File Uploaded successfully.";
                }
                catch
                {
                    ViewBag.Message = "Error while uploading the files.";
                }

                db.DriversReg.Add(driverReg);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(driverReg);
        }

型号

namespace HopeRemovalsFinal.Models
{
    public class DriverReg
    {
        [Key]
        public int DrvId { get; set; }
        public string FullName { get; set; }
        public string Address { get; set; }
        public string Postcode { get; set; }
        public string Contact { get; set; }
        public string Email { get; set; }
        public string County { get; set; }
        [DataType(DataType.Upload)]
        [Display(Name ="Upload File")]
        [Required(ErrorMessage ="Please choose file to upload")]
        public string File { get; set; }
    //    public string FileName { get; set; }
        public DateTime Date { get; set; }

    }
    public class DriverDbContext : DbContext
    {
        public DriverDbContext()
            : base("VanRemovals")
        {
        }

        public static DriverDbContext Create()
        {
            return new DriverDbContext();
        }

          public DbSet<DriverReg> DriversReg { get; set; }

    }
}

详情查看

            <dt>
                @Html.DisplayNameFor(model => model.File)
            </dt>

            <dd>
                @Html.DisplayFor(model => model.File)
            </dd>

数据库结果

 Create New
FullName    Address     Postcode    Contact     Email   County  Upload File     Date    
John    manchester  M32 7DD     098764587   john@hotm.com   Lancashire  uk_map.png  19/04/2016 00:00:00     Edit | Details | Delete

UploadedFiles 文件夹 为空,但文件已保存在 db 中。 感谢您的帮助。

【问题讨论】:

  • 当您说“数据库上的文件数据”和“文件已保存”时,您是在说文件本身被保存到数据库吗?或者您是否将文件系统上的位置作为字符串保存到该字段“文件”
  • 大家好,是的,文件已保存在数据库中,但无法在详细信息视图中显示
  • 确定吗?还是只保存了名字??
  • 另外,从您显示的代码中,我们从未看到您在传入的 DriverReg 对象上分配了 File 字段。
  • foreach(文件中的 HttpPostedFileBase 文件):文件可能为空

标签: c# asp.net asp.net-mvc razor asp.net-mvc-5


【解决方案1】:

我在您的代码中发现了几个错误。所以...这是我的解决方案:

型号:

[DataType(DataType.Upload)]
[Display(Name = "Upload File")]
[Required(ErrorMessage = "Please choose file to upload")]
[NotMapped]
public HttpPostedFileBase File { get; set; }

public string FileName { get; set; }

查看:

@Html.TextBoxFor(model => model.File, new { type = "file" })

控制器:

public ActionResult Create(DriverReg driverReg)
{
    ...
    var file = driverReg.File;
    var fileName = "~/Content/UploadedFiles/" + file.FileName;
    file.SaveAs(Server.MapPath(fileName));
    driverReg.FileName = fileName;
    ...
}

详细视图:

<dt>
    @Html.DisplayNameFor(model => model.File)
</dt>
<dd>
    <img src="@Model.FileName" />
</dd>

【讨论】:

  • driverReg.FileName 使用 MapPath 设置为绝对路径,使其无法用于 img 标签。最好存储相对路径。
【解决方案2】:

Create 允许多个文件似乎很奇怪,而 class DriverReg 只有一个 string File(或 FileName - 目前尚不清楚)不是一个集合。 p>

我会说更改 Create 方法以接受单个文件对象。
如有必要,还可以将表单调整为仅发布/上传一个文件。

然后,在Create 内部更改:

string filepathtosave = "UploadedFiles/" + filename;

到这里:

driverReg.File = "UploadedFiles/" + filename;

您可能需要进行更多我们在此处未看到的更改,但我认为执行上述所有操作应该会使其变得更好。

【讨论】:

  • 谢谢彼得,但我对上述内容进行了更改,但仍然只保存在数据库中,而不是 UploadedFiles 文件夹,也无法显示图像。
  • @prezequias 他是对的。您的模型只允许一个“文件”,我们只能假设您打算在此字段中存储文件路径而不是二进制文件数据。您正在传递一个发布的文件数组并循环它们。您只需要一个文件吗?
  • 保存文件会导致异常吗?如果是这样,请检查该文件夹的访问权限。或者如果没有发生异常,那么它可能已保存,但不是您要查找的位置。
  • 是的,我明白你的意思,我想传递一个文件,谢谢
  • 不,没有异常,它通过了,我检查过,它没有保存在任何地方。
猜你喜欢
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 2023-04-01
  • 2022-01-05
  • 1970-01-01
  • 2014-04-25
  • 2017-06-30
  • 1970-01-01
相关资源
最近更新 更多