Ton*_*llo 5 database sql-server asp.net-mvc image-processing data-uri
我正在使用DATA URI(客户端,使用画布)将图像发布到服务器.我现在有两个选择:我可以将"image"保存为varchar(max)列中的字符串,或者我可以将其转换为byte []并将其保存为varbinary(max).
就实施而言,努力是一样的.我试图确定哪个更有效率,直到1:数据库中的空间和2:显示图像.有没有人看到对此有任何分析或有一个很好的方法来衡量这个?
AN FYI - 一个3kb的图像在DB中大约有100K个字符.
使用:ASP.NET 4.5,MVC,SQL Server 2008
澄清
我可以使用varbinary(MAX)列中的byte []将图像存储在数据库中,就像通常情况一样,或者我可以存储HTML5画布中看起来像数据的DATA URI :image/png; base64,iVBORw0K .. .在varchar(max)列中.
存储byte []是典型的,无需进一步解释.存储DATA URI只是一个字符串,显示图像将是一个问题:
<img src="data:image/png;base64,iVBORw0K" /> or
<img src="@Model.Uri" />
Run Code Online (Sandbox Code Playgroud)
我的问题是哪一个更具性能和节省空间,如果有任何文档,白皮书或围绕这个具体比较的分析.
在 Binging with Google 找不到真正的答案和很少的信息的情况下,我做了一个简单的定时测试,插入了 20K 条记录(少于这个没有意义)并在循环中一次选择一条记录。我使用 PetaPoco 进行数据库访问。如果你在那里找到了一些东西或有一些信息,请分享。我认为这将是一个更常见的场景,因为 DATA URI 会受到更多关注。
URI 的插入和选择速度始终如一。相对更快,因为它以毫秒为单位。这不应该是一个因素 - 它是更容易的。
至于渲染到客户端。我使用了两种方法,来自 MVC 操作方法的 ImageResult(返回图像的自定义 ActionResult)(这是在 http 响应中呈现图像)并返回 URI 字符串并将其用作图像 SRC(即 src="@模型.Uri”)。再次,几乎没有区别。使用 Chrome 开发工具的结果:
ImageResult: 2 requests, 200ms, 3.2KB
DATA URI: 2 requests, 200ms, 3.9KB
Run Code Online (Sandbox Code Playgroud)
但是,我确实注意到 ImageResult (byte[]) 版本将自动被浏览器缓存,因为它是用于所有意图和目的的图像。DATA URI 版本不会被浏览器自动缓存。
从这个基本测试来看, byte[] 是要走的路,因为浏览器自动缓存并且所有其他结果都相同。
我的设置: i7、8GB 内存、SSD、SQL Server 2012、IIS Express
缓存好处是我在没有设置的情况下注意到的。是的,我确信可以管理 HTTP 标头、etag、输出缓存等。