从 SQL Server 读取 blob 并下载它

本文关键字:下载 blob 读取 SQL Server | 更新日期: 2024-11-07 17:50:57

我正在更新一个 asp.net 应用程序,并从mssql数据库中保存和检索文档。保存非常简单,但是有没有办法从直接从数据库下载的锚点下载文件?假设该 blob 绑定在网格视图或其他一些数据控件中,我想这样做,例如:<a href="<%#Eval("blobcolumn")%">Download Doc</a> .我也保存了文件名。

从 SQL Server 读取 blob 并下载它

首先,您不会将图像分配给 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>