7

我正在使用 DATA URI(客户端,使用画布)将图像发布到服务器。我现在有两个选择:我可以将“图像”作为字符串保存在 varchar(max) 列中,或者我可以将其转换为 byte[] 并将其保存为 varbinary(max)。

至于实施,努力是一样的。我正在尝试确定 1:数据库中的空间和 2:显示图像更有效。有没有人看到任何对此的分析或有衡量这个的好方法?

仅供参考 - 一个 3kb 的图像在数据库中大约有 100K 个字符。

使用:ASP.NET 4.5、MVC、SQL Server 2008

澄清

我可以使用 byte[] 在 varbinary(MAX) 列中将图像存储在数据库中,就像通常的情况一样,或者我可以存储来自 HTML5 画布的 DATA URI,看起来像data:image/png;base64,iVBORw0K.. .在 varchar(max) 列中。

存储 byte[] 是典型的,无需进一步解释。存储 DATA URI 只是一个字符串并显示图像将是:

<img src="data:image/png;base64,iVBORw0K" /> or
<img src="@Model.Uri" />

我的问题是哪一个更高效、更节省空间,以及是否有任何文档、白皮书或围绕此特定比较的分析。

4

1 回答 1

8

由于没有真正的答案并且发现 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

但是,我确实注意到 ImageResult (byte[]) 版本将自动被浏览器缓存,因为它是用于所有意图和目的的图像。DATA URI 版本不会被浏览器自动缓存。

从这个初步测试来看,byte[] 是可行的方法,因为浏览器的自动缓存和所有其他结果都是相同的。

我的设置: i7、8GB Ram、SSD、SQL Server 2012、IIS Express

缓存的好处是我在没有设置的情况下注意到的。是的,我确信可以管理 HTTP 标头、etag、输出缓存等。

于 2013-02-22T04:38:54.077 回答