【问题标题】:Reading blob from SQL Server and downloading it从 SQL Server 读取 blob 并下载
【发布时间】:2012-08-03 21:30:51
【问题描述】:
我正在更新一个 asp.net 应用程序并从 mssql 数据库保存和检索文档。保存非常简单,但是有没有办法从直接从数据库下载的锚点下载文件?假设该 blob 绑定在 gridview 或其他一些数据控件中,我想这样做,例如:<a href="<%#Eval("blobcolumn")%">Download Doc</a>。我也保存文件名。
【问题讨论】:
标签:
c#
asp.net
sql-server
blob
【解决方案1】:
首先,您不会将图像分配给 href 元素,而是创建一个 img 标签来显示图像,然后使用 href 标签下载它或将图像标签直接嵌入到 href 中:
<a href="http://somelink.com"><img src="<%#Eval("blobcolumn")%></img></a>
其次,将不带Url的图片内联显示到文件需要Data URI,这意味着网页中嵌入了base-64版本的图片:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot">
这种方法意味着您的网络服务器和最终用户的机器上会产生大量额外的流量,因为图像不会像您在网络服务器中提供图像的实际 URL(即 /images/ reddot.png)。
我认为最好将图像的副本保存到 Web 服务器并在页面中提供这些图像的 URL。
如果担心文件的大小或数量,您可以创建批处理作业以从临时图像缓存中清除超过特定天数或数小时的文件。
【解决方案2】:
你可以创建一个Handler来下载数据。
sample.ashx
public void ProcessRequest (HttpContext context)
{
string id = context.Request["id"];
if (!string.IsNullOrEmpty(id))
{
//read byte[] and other data from database based upon given ID
byte []ar=//result from database
string fileName=//filename
context.Response.ContentType = "Application/octet-stream";
context.Response.AddHeader("Content-Length", ar.Length.ToString());
context.Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName );
context.Response.BinaryWrite(ar);
context.Response.Flush();
context.Response.End();
}
}
并通过超链接请求
<a href="sample.ashx?id=101">Download .zip</a>
<a href='sample.ashx?id=<%#Eval("ID")%>'><%#Eval("Desc")%></a>