如何将图像插入sql server数据库?

2021-12-16 00:00:00 image sql-server razor asp.net-mvc-4 linq

如前所述,我试图在表格中插入一个图像,其中字段的类型是 Varbinary.

到目前为止我做了什么:

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

@using (Html.BeginForm("InsertProduct", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })){@Html.ValidationSummary(true)<字段集><legend>产品</legend><div class="editor-label">@Html.LabelFor(model => model.PRODUCT_ID)

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

<div class="editor-label">@Html.LabelFor(model =>model.PRODUCT_NAME)

<div class="editor-field">@Html.EditorFor(model =>model.PRODUCT_NAME)@Html.ValidationMessageFor(model =>model.PRODUCT_NAME)

<div class="editor-label">@Html.LabelFor(model => model.PRODUCT_IMAGE)

<div class="editor-field"><input type="file" name="PRODUCT_IMAGE" id="PRODUCT_IMAGE" style="width: 100%;"/>

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

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

public ActionResult InsertProduct(PRODUCT ord){已发送迁移实体 1 = 新迁移实体 1();sent.PRODUCT.Add(ord);sent.SaveChanges();列表<产品>产品 = sent.PRODUCT.ToList();返回视图(产品",产品);}

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

<块引用>

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

所以首先:这是处理图像的正确方法,其次,我想我需要对我的图像进行预处理以插入它:如何做到这一点?

谢谢!

<小时>

感谢收到的答案,似乎适合插入.但是对于显示,我仍然有问题(仅显示未找到的图像"图).我尝试通过两种方式做到这一点:1.并在控制器中

public Image LoadImage(int id){String serviceAddress = ConfigurationManager.AppSettings["WCFADDRESS"];DataServiceContext context = new DataServiceContext(new Uri(serviceAddress));PRODUCT product = context.Execute(new Uri(serviceAddress + "prod_id?prod_id=" + id)).ToList().FirstOrDefault();MemoryStream ms = new MemoryStream(product.PRODUCT_IMAGE);图像 img = Image.FromStream(ms);返回图像;}

还有 2.:

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

但是他们都没有工作.我究竟做错了什么 ?

解决方案

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

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

2) 像这样改变你的行动方法:

public ActionResult InsertProduct(PRODUCT ord,HttpPostedFileBase PRODUCT_IMAGE){如果(模型状态.IsValid){MigrationEntities1 sent = new MigrationEntities1();如果(图像!= null){ord.ProductImage=新字节[PRODUCT_IMAGE.ContentLength];ord.ImageMimeType = PRODUCT_IMAGE.ContentType;PRODUCT_IMAGE.InputStream.Read(ord.ProductImage, 0,PRODUCT_IMAGE.ContentLength);}别的{//设置默认图片:图像 img = Image.FromFile(Server.MapPath(Url.Content("~/Images/Icons/nopic.png")));MemoryStream ms = new MemoryStream();img.Save(ms, ImageFormat.Png);//改成其他格式ms.Seek(0, SeekOrigin.Begin);ord.ProductImage=新字节[ms.Length];ord.ImageMimeType=图像/png";ms.Read(ord.Pic, 0, (int)ms.Length);}尝试{sent.PRODUCT.Add(ord);sent.SaveChanges();ViewBag.HasError = "0";ViewBag.DialogTitle = "插入成功";ViewBag.DialogText = "...";}抓住{ViewBag.HasError = "1";ViewBag.DialogTitle = "服务器错误!";ViewBag.DialogText = "...";}列表<产品>产品 = sent.PRODUCT.ToList();返回视图(产品",产品);}返回视图(顺序);}

此操作方法仅用于创建.你也需要一些编辑和索引工作.如果你在做它们时遇到问题,请告诉我将它们的代码添加到答案中.

更新:如何显示图像:

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

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

 [AllowAnonymous]公共文件内容结果 GetProductPic(int id){产品 p = db.PRODUCTS.FirstOrDefault(n => n.ID == id);如果(p != 空){返回文件(p.ProductImage,p.ImageMimeType);}别的{返回空;}}

2) 在视图的 @foreach(...) 结构中添加一个 <img> 标记(或您想要的任何地方),如下所示:>

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

As said, i'm trying to insert an image in a table, where the type of the field is Varbinary.

What i've done so far :

I've a form with many fields:

@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>
}

And all these fields allow me to construct a PRODUCT object in my controller :

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);
    }

But when i'm trying to upload the image (by clicking on Create button), i've the following :

entry is not a valid base64 string because it contains a character that is not base 64

So first of all : is it the right way to deal with images and second, I think I need to do a pre-treatemant on my image to insert it : how to o that ?

Thanks !


Edit :

Thanks to answers received, seems to be good for insertion. But for displaying, I still have issues (only the "not found image" piture is displayed). I've try to do it two ways : 1. <img src="LoadImage?id=@Model.product.PRODUCT_ID"/> and in the controller

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;
    }

And 2. :

@{

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

But none of them are working. What am I doing wrong ?

解决方案

1) Change your database table to have these columns:

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

2) Change your action method like this:

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);
    }

This action method is just for create. you need some works for edit and index too. If you have problem to doing them, tell me to add codes of them to the answer.

Update: How to show images:

One way to show stored images is as the following:

1) Add this action method to your controller:

    [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) Add a <img> tag in the @foreach(...) structure of your view (or wherever you want) like this:

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

相关文章