【问题标题】:How to insert an image into sql server database?如何将图像插入到 sql server 数据库中?
【发布时间】:2013-07-31 09:25:13
【问题描述】:

如前所述,我正在尝试在表格中插入图像,其中字段的类型是 Varbinary。

到目前为止我做了什么:

我有一个包含许多字段的表单:

@using (Html.BeginForm("InsertProduct", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>PRODUCT</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.PRODUCT_ID)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.PRODUCT_ID)
            @Html.ValidationMessageFor(model => model.PRODUCT_ID)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.PRODUCT_NAME)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.PRODUCT_NAME)
            @Html.ValidationMessageFor(model => model.PRODUCT_NAME)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.PRODUCT_IMAGE)
        </div>
        <div class="editor-field">
            <input type="file" name="PRODUCT_IMAGE" id="PRODUCT_IMAGE" style="width: 100%;" />
        </div>

        <p>
            <input type="submit" value="Create" class="btn btn-primary"/>
        </p>
    </fieldset>
}

所有这些字段都允许我在我的控制器中构造一个 PRODUCT 对象:

public ActionResult InsertProduct(PRODUCT ord)
    {
        MigrationEntities1 sent = new MigrationEntities1();
        sent.PRODUCT.Add(ord);
        sent.SaveChanges();
        List<PRODUCT> Products = sent.PRODUCT.ToList();
        return View("Products", Products);
    }

但是当我尝试上传图片时(通过点击创建按钮),我有以下内容:

entry 不是有效的 base64 字符串,因为它包含一个字符 这不是基数 64

首先:这是处理图像的正确方法,其次,我认为我需要对我的图像进行预处理以插入它:如何操作?

谢谢!


编辑:

感谢收到的答案,似乎很适合插入。但是对于显示,我仍然有问题(仅显示“未找到图像”图)。我尝试了两种方法: 1. &lt;img src="LoadImage?id=@Model.product.PRODUCT_ID"/&gt; 并在控制器中

public Image LoadImage(int id)
    {
        String serviceAddress = ConfigurationManager.AppSettings["WCFADDRESS"];
        DataServiceContext context = new DataServiceContext(new Uri(serviceAddress));
        PRODUCT product = context.Execute<PRODUCT>(new Uri(serviceAddress + "prod_id?prod_id=" + id)).ToList().FirstOrDefault();

        MemoryStream ms = new MemoryStream(product.PRODUCT_IMAGE);
        Image img = Image.FromStream(ms);
        return img;
    }

还有 2。:

@{

    if (Model.product.PRODUCT_IMAGE != null)
    {
        WebImage wi = new WebImage(Model.product.PRODUCT_IMAGE);
        wi.Resize(700, 700,true, true);
        wi.Write();
    }    
}

但它们都不起作用。我究竟做错了什么 ?

【问题讨论】:

标签: sql-server image linq asp.net-mvc-4 razor


【解决方案1】:

1) 更改您的数据库表以包含这些列:

1: ProductImage - varbinary(MAX)
2: ImageMimeType - varchar(50)

2) 像这样更改您的操作方法:

public ActionResult InsertProduct(PRODUCT ord, 
    HttpPostedFileBase PRODUCT_IMAGE)
{        
    if (ModelState.IsValid)        
        {
            MigrationEntities1 sent = new MigrationEntities1();
            if (image != null)
            {
                ord.ProductImage= new byte[PRODUCT_IMAGE.ContentLength];
                ord.ImageMimeType = PRODUCT_IMAGE.ContentType;
                PRODUCT_IMAGE.InputStream.Read(ord.ProductImage, 0,
                    PRODUCT_IMAGE.ContentLength);
            }

            else
            {
                // Set the default image:
                Image img = Image.FromFile(
                    Server.MapPath(Url.Content("~/Images/Icons/nopic.png")));
                MemoryStream ms = new MemoryStream();
                img.Save(ms, ImageFormat.Png); // change to other format
                ms.Seek(0, SeekOrigin.Begin);
                ord.ProductImage= new byte[ms.Length];
                ord.ImageMimeType= "image/png";
                ms.Read(ord.Pic, 0, (int)ms.Length);
            }

            try
            {
                sent.PRODUCT.Add(ord);
                sent.SaveChanges();

                ViewBag.HasError = "0";
                ViewBag.DialogTitle = "Insert successful";
                ViewBag.DialogText = "...";
            }
            catch
            {
                ViewBag.HasError = "1";
                ViewBag.DialogTitle = "Server Error!";
                ViewBag.DialogText = "...";
            }

            List<PRODUCT> Products = sent.PRODUCT.ToList();
            return View("Products", Products);
        }

        return View(ord);
    }

此操作方法仅用于创建。您也需要一些用于编辑和索引的作品。如果您有问题,请告诉我将它们的代码添加到答案中。

更新:如何显示图片:

显示存储图像的一种方法如下:

1) 将此操作方法添加到您的控制器:

    [AllowAnonymous]
    public FileContentResult GetProductPic(int id)
    {
        PRODUCT p = db.PRODUCTS.FirstOrDefault(n => n.ID == id);
        if (p != null)
        {
            return File(p.ProductImage, p.ImageMimeType);
        }

        else
        {
            return null;
        }
    }

2) 在视图的@foreach(...) 结构中添加一个&lt;img&gt; 标记(或任何您想要的位置),如下所示:

<img width="100" height="100" src="@Url.Action("GetProductPic", "Products", routeValues: new { id = item.ID })" />

【讨论】:

  • 您的解决方案是我正在研究的解决方案。我现在编辑了我的帖子,我在显示恢复的图像时遇到了一些问题。
【解决方案2】:

将 sql 服务器上的 Image 类型更改为 Byte[] 并使用类似的东西。这就是我过去存储图像的方式。

http://www.codeproject.com/Articles/15460/C-Image-to-Byte-Array-and-Byte-Array-to-Image-Conv

如果没有,您总是可以将图像存储在本地,并通过字符串将图像位置传递到 SQL 数据库中,这种方法效果很好并且设置起来很快。

【讨论】:

    【解决方案3】:

    所以,这里是要做的修改:

    1. 在数据库中插入数据:

      [HttpPost]

      public ActionResult InsertProduct(PRODUCT ord, HttpPostedFileBase image) { 已发送的 MigrationEntities1 = 新的 MigrationEntities1(); 如果(图像!= null) { ord.PRODUCT_IMAGE = 新字节[image.ContentLength]; image.InputStream.Read(ord.PRODUCT_IMAGE, 0, image.ContentLength); } 已发送.PRODUCT.Add(ord); 已发送.SaveChanges(); 列出产品 = sent.PRODUCT.ToList(); 返回视图(“产品”,产品); }

    注意:这是“轻松”的方式,对于更完整的内容,请查看 Amin 的答案。

    1. 用于显示:

    在视图中

    <img src="LoadImage?id=@Model.product.PRODUCT_ID"/>
    

    在控制器中:

    public FileContentResult LoadImage(int id)
        {
            String serviceAddress = ConfigurationManager.AppSettings["WCFADDRESS"];
            DataServiceContext context = new DataServiceContext(new Uri(serviceAddress));
            PRODUCT product = context.Execute<PRODUCT>(new Uri(serviceAddress + "prod_id?prod_id=" + id)).ToList().FirstOrDefault();
    
            return new FileContentResult(product.PRODUCT_IMAGE, "image/jpeg");
        }
    

    现在一切正常,谢谢!

    【讨论】:

      猜你喜欢
      • 2015-06-08
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      相关资源
      最近更新 更多