【问题标题】:Want to save a image to a folder and saving the url in database想要将图像保存到文件夹并将 url 保存在数据库中
【发布时间】:2015-08-24 08:47:24
【问题描述】:

我是 asp.net mvc 的新手。在这里我在控制器图像上传中遇到问题任何人都可以提供帮助??我从互联网上获得的这个示例控制器,我应该更改什么和代码 viewnya 之类的,这里我想通过“AvatarUrl”保存图像

模型 > 员工服务

public class EmployeeModel{

    [ScaffoldColumn(false)]
    public int EmployeeID { get; set; }

    [Required(ErrorMessage = "Please Enter Position ID")]
    public int PositionID { get; set; }

    [Required(ErrorMessage = "Please Enter NO PEK")]
    public string NoPEK { get; set; }

    [Required(ErrorMessage = "Please Enter NO KTP")]
    public string NoKTP { get; set; }

    [Required(ErrorMessage = "Please Enter TaxID")]
    public string TaxID { get; set; }

    [Required(ErrorMessage = "Please Enter FirstName")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Please Enter LastName")]
    public string LastName { get; set; }

    [Required(ErrorMessage = "Please Enter OrganizationID")]
    public int OrganizationID { get; set; }

    [Required(ErrorMessage = "Please Enter BirthPlace")]
    public string BirthPlace { get; set; }

    [Required(ErrorMessage = "Please Enter BirthDay")]
    public System.DateTime BirthDay { get; set; }

    [Required(ErrorMessage = "Please Enter Gender")]
    public string Gender { get; set; }

    [Required(ErrorMessage = "Please Enter Religion")]
    public string Religion { get; set; }

    [Required(ErrorMessage = "Please Enter TaxAddress")]
    public string TaxAddress { get; set; }

    [Required(ErrorMessage = "Please Enter Home Address")]
    public string HomeAddress { get; set; }

    [Required(ErrorMessage = "Please Enter Current Address")]
    public string CurrentAddress { get; set; }

    [Required(ErrorMessage = "Please Enter Phone Number")]
    public string PhoneNumber { get; set; }

    [Required(ErrorMessage = "Please Enter Email")]
    public string Email { get; set; }

    [Required(ErrorMessage = "Please Enter IsAuditor")]
    public string IsAuditor { get; set; }

    [Required(ErrorMessage = "Please Enter TaxProvince ")]
    public int TaxProvinceID { get; set; }

    [Required(ErrorMessage = "Please Enter Tax City ")]
    public int TaxCityID { get; set; }

    [Required(ErrorMessage = "Please Enter Home Province ")]
    public int HomeProvinceID { get; set; }

    [Required(ErrorMessage = "Please Enter Home City")]
    public int HomeCityID { get; set; }

    [Required(ErrorMessage = "Please Enter Current Province")]
    public int CurrentProvinceID { get; set; }

    [Required(ErrorMessage = "Please Enter Current City")]
    public int CurrentCityID { get; set; }

    [Required(ErrorMessage = "Please Enter Avatar Url")]
    public string AvatarUrl { get; set; }
}

控制器 > 员工控制器

    [HttpPost]
    public ActionResult Create(EventModel eventmodel, HttpPostedFileBase file)
    {
        if (ModelState.IsValid)
        {
            var filename = Path.GetFileName(file.FileName);
            var path = Path.Combine(Server.MapPath("~/Uploads/Photo/"), filename);
            file.SaveAs(path);
            tyre.Url = filename;

            _db.EventModels.AddObject(eventmodel);
            _db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(eventmodel);
    }

【问题讨论】:

  • 你可以在_db.EventModels.AddObject(eventmodel);行前做:eventmodel.AvatarUrl = "~/Uploads/Photo/"+filename;

标签: c# asp.net asp.net-mvc database asp.net-mvc-4


【解决方案1】:

上传文件、存储在本地文件系统中以及保存到数据库是一种常见的模式。这些是我的建议。

1.不要使用上传的文件名作为文件名。

这很常见:

var filename = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/Uploads/Photo/"), filename);
file.SaveAs(path);

不要这样做。有几个原因:

a) 文件名可能会发生冲突。 b) 远程文件名可能与您的本地文件系统不兼容。 c) 有人可能会尝试恶意文件名,这样做可能会破坏您的服务器。

相反,生成您自己的文件名(可能使用 GUID,GUID.NewGuid().ToString())并将原始文件名存储在您的数据库中。

2。不要将所有文件存储在一个文件夹中

有时,您的文件夹将包含太多文件,操作系统无法快速处理。

用一些有用的东西对文件进行分区,比如用户 ID。这也有助于在用户之间隔离文件。

3.不要将文件的完整路径存储在数据库中

在某些时候,您可能会移动文件(可能移动到不同的驱动器),您存储的所有文件位置都将被破坏。

4.不要将图像 URL 存储在数据库中

与#3 相同。如果您的 Web 应用程序发生更改并且您想要更改图像 URL,那么您在数据库中存储的 URL 不正确。您必须扫描并更新所有数据库记录。

5.不要在数据库中存储冗余路径信息

虽然在数据库中存储的 URL 中包含“Uploads/Photo/”可能很诱人,但它也有很多问题:

a) 这是冗余数据。对于每个文件,您都在使用额外的、不必要的数据空间。 b) 如果您的应用发生更改并且 URL 应该更改,那么您存储的 URL 现在已损坏。

相反,在您从数据库中读取值之后,将“Uploads/Photo/”添加到 URL。

更新:

这里是一些示例代码:

    [HttpPost]
    public ActionResult Create(EventModel eventmodel, HttpPostedFileBase file)
    {
        if (ModelState.IsValid)
        {
            var originalFilename = Path.GetFileName(file.FileName);
            string fileId = Guid.NewGuid().ToString().Replace("-", "");
            string userId = GetUserId(); // Function to get user id based on your schema

            var path = Path.Combine(Server.MapPath("~/Uploads/Photo/"), userId, fileId);
            file.SaveAs(path);

            eventModel.ImageId = fileId;
            eventmodel.OriginalFilename = originalFilename;

            _db.EventModels.AddObject(eventmodel);
            _db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(eventmodel);
    }

但是,我会谨慎使用您的数据模型作为 MVC 操作模型。

【讨论】:

    【解决方案2】:

    您应该将您的 AvatarUrl 更改为:

    public HttpPostedFileBase AvatarUrl { get; set; }
    

    在您看来,您可以创建类似于以下内容的表单。添加您将接受输入的字段,并为您的头像使用文件输入。当表单回传到控制器时,MVC 将尝试将输入绑定到参数。

    @using(Html.BeginForm("Create", FormMethod.Post, new { enctype = "multipart/form-data" }) {
        <fieldset>
            @Html.LabelFor(m => m.FirstName)
            @Html.EditorFor(m => m.FirstName)
        </fieldset>
        <!--    
        REST OF YOUR INPUT FIELDS HERE
        -->
        <fieldset>
            @Html.LabelFor(m => m.Avatar)
            @Html.EditorFor(m => m.Avatar)
        </fieldset>
        <input type="submit" value="Submit" />
    })
    

    您的控制器方法应更新为:

    [HttpPost]
    public ActionResult Create(EmployeeModel model)
    {
        if (ModelState.IsValid)
        {
            // Create avatar on server
            var filename = Path.GetFileName(model.AvatarUrl.FileName);
            var path = Path.Combine(Server.MapPath("~/Uploads/Photo/"), filename);
            file.SaveAs(path);
            // Add avatar reference to model and save
            model.AvatarUrl = string.Concat("Uploads/Photo/", filename);
            _db.EventModels.AddObject(model);
            _db.SaveChanges();
    
            return RedirectToAction("Index");
        }
        return View(model);
    }
    

    如果您仍然卡住,请告诉我,我可以更详细地说明。

    还有一篇与您在这里尝试做的事情相关的优秀/详细的文章http://cpratt.co/file-uploads-in-asp-net-mvc-with-view-models/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      相关资源
      最近更新 更多