从 SQL Server 读取 blob 并下载它
本文关键字:下载 blob 读取 SQL Server | 更新日期: 2024-11-07 17:50:57
我正在更新一个 asp.net 应用程序,并从mssql数据库中保存和检索文档。保存非常简单,但是有没有办法从直接从数据库下载的锚点下载文件?假设该 blob 绑定在网格视图或其他一些数据控件中,我想这样做,例如:<a href="<%#Eval("blobcolumn")%">Download Doc</a>
.我也保存了文件名。
首先,您不会将图像分配给 href 元素,您将创建一个 img 标签来显示图像,然后创建 href 标签来下载它或直接在 href 中嵌入图像标签:
<a href="http://somelink.com"><img src="<%#Eval("blobcolumn")%></img></a>
其次,以内联方式显示图像而不显示文件的 URL 需要数据 URI,这意味着网页中嵌入了 base-64 版本的图像:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot">
这种方法意味着您的 Web 服务器和最终用户的计算机上有大量额外的流量,因为图像不会被缓存,就像您在 Web 服务器中提供图像的实际 URL 一样(即/images/reddot.png)。
我认为最好将图像的副本保存到Web服务器并在页面中提供这些图像的URL。
如果担心文件的大小或数量,可以创建批处理作业以从临时映像缓存中清除超过特定天数或小时
您可以创建处理程序来下载数据。
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>