如何以二进制格式下载存储在SQL DB中的文件

时间:2009-12-14 17:55:15

标签: asp.net sql-server file-upload download

我只是将上传的文件存储到SQL Server的二进制字段中,但我还需要允许用户使用Asp.NET下载它。我怎么能这样做?

提前致谢。

3 个答案:

答案 0 :(得分:7)

Here's a Microsoft Knowledge Base article on this.

如何从数据库中检索文件取决于您使用的数据访问技术;我将假设您有一些包含该文件的字节数组data(例如,通过填充数据集并访问该字段)和一些字符串filename

Response.Clear()
Response.ContentType = "application/octet-stream"
Response.AddHeader("Content-Disposition", "attachment;filename=""" & filename & """")
Response.BinaryWrite(data)
Response.End()

将上述代码放入某些download.aspx并链接到此文件。您可能希望将一些查询字符串信息传递给download.aspx,以便您的代码知道从数据库中获取哪个文件。

答案 1 :(得分:3)

将数据读入文件流对象,并在其上添加相应的扩展名,并让用户下载生成的文件。

您需要在文件流上使用System.IO BinaryWriter对象来创建文件......如下所示:

FileStream fs = new FileStream("thisfile.bin", FileMode.Create);
binWriter= new BinaryWriter(fs);    

binWriter.Write(varHoldingSqlRetrievedBinaryData);

答案 2 :(得分:2)

将Generic Handler(.ashx)页面添加到您的网站。下面的ashx代码主体演示了如何读取任意流(在本例中是来自磁盘的PNG文件)并将其写在响应中:

using System;
using System.Web;
using System.IO;

namespace ASHXTest
{
    public class GetLetter : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            // Get letter parameter from query string.
            string fileName = context.Request.MapPath(string.Format("{0}.png",
                context.Request.QueryString["letter"]));

            // Load file from disk/database/ether.
            FileStream stream = new FileStream(fileName, FileMode.Open,
                FileAccess.Read);
            byte[] buffer = new byte[stream.Length];
            stream.Read(buffer, 0, buffer.Length);
            stream.Close();

            // Write response headers and content.
            context.Response.ContentType = "image/png";
            context.Response.OutputStream.Write(buffer, 0, buffer.Length);
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

如果需要,您还可以设置Content-Disposition标题,如Heinzi的答案所示:

context.Response.AddHeader("Content-Disposition",
    "attachment;filename=\"letter.png\"");