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