2013-11-22 72 views
0

我想從畫布捕捉圖片,使其成爲base64並將其保存到數據庫中。是否有可能將base64直接保存到表中? 這是我來了已經:asp.net mvc:將base64圖像數據保存到表格

VIEW:

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: Validation failed for one or more entities.

的問題時,我已經加入

public string IMG { get; set; } 

到模型中發生。當我現在禁用

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

一切正常。

thx

+0

服務器上的模型是什麼樣子的?看起來你已經指定了驗證規則。 –

+0

您的錯誤是EF錯誤,請提供更多詳細信息 –

+0

我已添加一些額外的詳細信息。請讓我知道是否需要更多東西。 thx – nevo

回答

1

根據你的錯誤信息,錯誤的現象發生,因爲你的模型不適合數據庫規則。例如,您正在將空值發送給非空值,或者您試圖將太多信息放入列中(128字節列中的255個字節)。使用位於該鏈接的信息來幫助你發現的實體的什麼屬性失敗 - Validation failed for one or more entities while saving changes to SQL Server Database using Entity Framework

既然已經做了,我看你的實際的實體錯誤是

IMG Error: The field IMG must be a string or array type with a maximum length of '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表格,然後右鍵單擊曲面並選擇從數據庫更新模型,然後按照步驟重新添加表格。

編輯基於業務方案的響應

,我們應該包括如何在SQL CE大VARCHAR列以及。要首先針對SQL CE執行代碼,請使用以下代碼段:

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

感謝您的詳細解答。就是這樣。對於我的應用程序開發,我使用SQL CE(沒有在我的Q中說過),所以最終我發現它是_ntext_對於SQL CE(_varchar(MAX)_然後對於SQL Server)。但工作得很好,我的base64數據已經存儲在我的db列中:) SQL CE的最終代碼片段 _ [Column(TypeName =「ntext」)] public string Img {get; set;} _ – nevo

+0

@nevo - 真棒,我更新了我的答案以覆蓋SQL CE! – Tommy

+0

壞消息。不幸的是,我保存之前做了一些歪曲(縮短)base64字符串。這就是爲什麼我能夠將它保存到_「ntext」string_,正如我上面提到的那樣。在我糾正錯誤之後,我再次收到_The字段IMG必須是最大長度爲'4000'_錯誤的字符串或數組類型,無論Img字符串是否爲ntext。恐怕SQL CE不會'吃'像base64這樣的長字符串。或者還有一些其他問題(需要解碼/編碼??)... – nevo

0

是否有原因需要Base64?它增加了必須對數據庫進行編碼和解碼的開銷。如果可以,最好將圖像數據(未編碼)作爲二進制斑點存儲在數據庫中。也就是說,如果您的圖片尺寸較小。

微軟提供了一個很好的文檔(https://research.microsoft.com/pubs/64525/tr-2006-45.pdf),稱爲「到BLOB或不到BLOB」關於是否應該將圖像存儲在數據庫中。基本的規則是如果你的映像是256KB或更少,可以存儲在數據庫中。如果大於1MB,那麼最好將圖像存儲在文件系統中,並直接從服務器上提供。

MS SQL Server 2012中可以自動管理二進制數據存儲文件系統爲你與它的新文件表功能:http://blogs.msdn.com/b/mvpawardprogram/archive/2012/07/23/sql-server-2012-migrating-blobs-to-filetables.aspx

+0

如果它們大於256KB但小於1MB會怎麼樣? :) – Tommy

+0

我想直接將它存儲到數據庫的原因是,並非所有創建後的記錄都將在以後「保存」。因此,如果我將圖像存儲在文件系統中,那麼我需要從文件系統中刪除數據庫記錄和圖像,而不是僅刪除數據庫記錄。 是的,圖片將是256KB或更少。據我所知,諾沃, – nevo

+0

。但是如果你的圖片大於1MB,你的表現可能會受到影響。沒關係,在DB中存儲就好了。但爲了獲得更好的性能,請不要打擾base64,只是將其存儲爲一個blob。在2012年之前的SQL Server版本中,他們甚至提供了「IMAGE」類型:http://technet.microsoft.com/en-us/library/ms187993.aspx 如果您有幸使用Server 2012,新的FILETABLE可以爲您提供兩全其美的體驗。它爲您管理文件系統上的數據! http://blogs.msdn.com/b/mvpawardprogram/archive/2012/07/23/sql-server-2012-migrating-blobs-to-filetables.aspx – nemik

相關問題