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

时间:2013-11-22 15:25:55

标签: c# asp.net-mvc entity-framework html5-canvas base64

我想从画布中捕获图片,将其设为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

MODEL:

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;

一切正常。

THX

2 个答案:

答案 0 :(得分:1)

根据您的错误消息,发生错误,因为您的模型不符合数据库规则。例如,您正在向不可为空的值发送null,或者您试图在列中放入太多信息(128字节列中的255个字节)。使用此链接中的信息可帮助您准确发现实体的哪些属性失败 - Validation failed for one or more entities while saving changes to SQL Server Database using Entity Framework

既然你已经这样做了,我看到你的实际实体错误是

  

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

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

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

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

修改

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

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

答案 1 :(得分:0)

你需要Base64吗?它增加了必须对数据库进行编码和解码的开销。如果可以,最好将图像数据(未编码)作为二进制blob存储在数据库中。也就是说,如果你的图像尺寸很小。

Microsoft提供了一个好的文档(https://research.microsoft.com/pubs/64525/tr-2006-45.pdf),称为“BLOB或不是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