从SQL Server读取blob并下载它

时间:2012-08-06 21:33:00

标签: c# asp.net sql-server blob

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

2 个答案:

答案 0 :(得分:3)

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

我认为将图像副本保存到网络服务器并在页面中为这些图像提供网址会更好。

如果担心文件的大小或数量,您可以创建批处理作业,以清除临时图像缓存中超过特定​​天数或小时数的文件。

答案 1 :(得分:2)

您可以创建处理程序来下载数据。

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>