1

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

4

2 回答 2

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),图像将不会被缓存)。

我认为最好将图像的副本保存到 Web 服务器并在页面中提供这些图像的 url。

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

于 2012-08-06T21:57:53.027 回答
2

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

样本.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>
于 2012-08-07T02:59:38.270 回答