繁体   English   中英

asp.net mvc:将base64图像数据保存到表中

[英]asp.net mvc: save base64 image data to table

我想从画布上捕获图片,将其设为base64并将其保存到db中。 是否可以将base64直接保存到表? 这是我已经来过的地方:

视图:

var canvas = document.getElementById("myCanvas");
var ctx = canvas.getContext("2d");
var img = document.getElementById("image0");
ctx.drawImage(img, 0, 0);
//drawing image into myCanvas

var imag = canvas.toDataURL("image/png");
//making base64 from that image

document.getElementById('imag').value = imag;
//passing base64 to @Html.TextAreaFor(model => model.IMG, new {id = "imag"}) prior to submitting

模型:

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.ComponentModel.DataAnnotations;

namespace myApp.Models
{ 
public class MYCLASS
    {
     public int ...
     public string ...
     public string IMG { get; set; }
    }
}

控制器:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult myImageToDB(MYCLASS myclass)
{

   if (ModelState.IsValid)
   {
      db.MYCLASSs.Add(myclass);
      db.SaveChanges();
      //here it fails on db.SaveChanges()
      return RedirectToAction("Detail", "M35");
   }
   return View(myclass);
}

提交后,我仅从MS VS得到以下答案:

System.Data.Entity.Validation.DbEntityValidationException:对一个或多个实体的验证失败。

我添加后出现了问题

public string IMG { get; set; }

进入模型。 当我现在禁用

document.getElementById('imag').value = imag;

一切正常。

谢谢

根据您的错误消息,发生错误是因为您的模型不符合数据库规则。 例如,您要向一个不能为空的值发送一个null,或者您试图在一个列中放入太多信息(128字节列中为255个字节)。 使用此链接中的信息可帮助您准确发现实体的哪个属性发生故障- 使用实体框架将更改保存到SQL Server数据库时,一个或多个实体的验证失败

现在您已经完成了,我看到您的实际实体错误是

IMG错误:IMG字段必须是最大长度为'4000'的字符串或数组类型。

如果在声明整数时指定(varchar(4000) varchar(n|MAX)的限制为4000。 但是,使用varchar(MAX)可以在每条记录的一个字段中提供2GB的存储空间。 这样,我们需要查看在EF实现中是先使用代码还是数据库。 如果首先使用代码,请使用varchar(MAX)注释列,如下所示。

[Column(TypeName = "varchar(MAX)")]
public string Img {get;set;}

如果首先使用数据库,则转到数据库(Sql Management Studio),右键单击该表,然后选择“设计”。 将图像字段更新为varchar(MAX)作为类型并保存。 为了更新EF,请打开EF设计器,删除现有的Images表,然后右键单击该表面并从Database中选择Update model,然后按照步骤重新添加表。

编辑

根据OP的响应,我们还应介绍如何在SQL CE中创建大型varchar列。 要首先针对SQL CE执行代码,请使用以下代码段:

[Column(TypeName = "ntext")]
[MaxLength] 
public string Img {get;set;}

您是否需要Base64的原因? 这增加了必须对数据库进行编码和解码的开销。 如果可以的话,最好将图像数据(未编码)简单地存储为二进制二进制文件到数据库中。 也就是说,如果您的图像尺寸很小。

Microsoft提供了一个很好的文档( https://research.microsoft.com/pubs/64525/tr-2006-45.pdf ),该文档称为“ To to BLOB or not to BLOB”,有关是否应在数据库中存储图像。 基本规则是,如果映像小于或等于256KB,则可以存储在DB中。 如果大于1MB,则最好将图像存储在文件系统中,然后从服务器中直接将其提供服务。

MS SQL Server 2012可以使用其新的FILETABLE功能自动为您管理二进制数据的文件系统存储: http : //blogs.msdn.com/b/mvpawardprogram/archive/2012/07/23/sql-server-2012-migrating- blobs-to-filetables.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM