如何在文件中保存图像并使用MVC3将图像名称保存到数据库?

时间:2012-05-04 11:51:26

标签: asp.net-mvc-3 image

我需要将用户从文件上传控件中选择的图像保存到站点中的文件(如内容/图像),并使用GUID作为此图像的名称,并将此GUID保存到数据库。 我是MVC的新手,所以请帮我详细说明。 谢谢你们。 这是我的控制器...

    [HttpPost]
    public ActionResult Create(Product product,HttpPostedFileBase file)
    {
        if (file!=null&&file.ContentLength>0)
        {
            var FileName = string.Format("{0}.{1}",Guid.NewGuid(),file.ContentType);
            var path = Path.Combine(Server.MapPath("~/Content/Images"), FileName);
            file.SaveAs(path);
        }
        if (ModelState.IsValid)
        {
            db.Products.AddObject(product);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.CategoryID = new SelectList(db.Categories, "CategoryID", "CategoryName", product.CategoryID);
        return View(product);
    }

这是我的观点...

        @using (Html.BeginForm("Create", "Product", FormMethod.Post, new { enctype = "multipart/form-data" }))
        {
            <input type="file" name="Uploader" />
        }

我根本不知道发生了什么...... 但是没有HttpPostedFileBase实例,所以if语句失败。

6 个答案:

答案 0 :(得分:0)

在您看来,<input type="file" />的名称应为"file",以便模型Binder将其分配给您操作中的file参数。

基本上是这样的:

    @using (Html.BeginForm("Create", "Product", FormMethod.Post, new { enctype = "multipart/form-data" })) 
    { 
        <input type="file" name="file" /> 
    }

答案 1 :(得分:0)

尝试将HttpPostedFileBase参数从文件重命名为Uploader并再次测试

从公共ActionResult Create(产品,HttpPostedFileBase文件)更改 公共ActionResult Create(产品产品,HttpPostedFileBase Uploader)

我的意思是html标签的名称和参数名称是相同的。

答案 2 :(得分:0)

将您的操作更改为:

[HttpPost]
public ActionResult Create(Product product)
{
    var files = controllerContext.RequestContext.HttpContext.Request.Files;

    foreach (string inputName in files)
    {
        file = files[inputName];

        if (file != null && file.ContentLength > 0)
        {
            var FileName = string.Format("{0}.{1}", Guid.NewGuid(), file.ContentType);
            var path = Path.Combine(Server.MapPath("~/Content/Images"), FileName);
            file.SaveAs(path);
        }

    }

    ... do other stuff here ...

}

答案 3 :(得分:0)

你需要一些如下所示的条件。 Contenttype值类似于这个图像/ png,image / gif,image / jpeg,所以当你把它组合起来时这样:

0f269598-0d66-4453-a3b5-a8f07254c531.image / PNG

此处代码

string fileExt = "jpg";
if (Imagename.ContentType == "image/png") { fileExt = "png"; }
else if (Imagename.ContentType == "image/gif") { fileExt = "gif"; }
else if (Imagename.ContentType == "image/jpeg") { fileExt = "jpg"; }

答案 4 :(得分:0)

使用这样的方法而不是比较所有图像类型:

 fileName = string.Format("{0}{1}", Guid.NewGuid(),
 Path.GetExtension(file.FileName));

答案 5 :(得分:0)

为什么不在产品模型中添加'HttpPostedFileBase文件'而不是单独发送它,例如: 模型:

 public HttpPostedFileBase File { get; set; } 

视图:

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

它对我来说就像一个魅力!!

哦。顺便说一句。如果您使用的是数据库第一实体模型..您需要通过部分类添加该额外字段,即。

public partial class Product                    
    {
        public HttpPostedFileBase File { get; set; }
    }