从数据库下载二进制文件

时间:2010-05-04 15:18:30

标签: asp.net vb.net file

我在数据库中有一个二进制文件。 如何在单击按钮时在页眉中下载此文件

任何想法??

2 个答案:

答案 0 :(得分:2)

好吧,如果你使用脚本生成文件,脚本说它输出的最常见方式是发送一个看起来像这样的HTTP头:

Content-Type: text/html; charset=utf-8

这将使浏览器显示为文本。为了强制[大多数浏览器]下载文件,您需要发送以下附加标题:

Content-Type: application/zip
Content-Disposition: inline; filename=test.zip
Content-Length: 8192

[FILE CONTENTS]

作为名为“test.zip”的8kb ZIP文件的示例。如果你能找到一些方法来改变使用生成文件的脚本发送的标题(即从数据库中提取它),那么它很可能会迫使浏览器将其解释为要下载的文件。

然后,只需链接到标题中的脚本。

答案 1 :(得分:1)

好吧,你可能会尝试做一些事情,但事情并不完全清楚,但我会捅它。假设您有以下基本数据库,包括文件标识符和二进制文件信息:

CREATE TABLE Test
(
FileId int identity(1,1) PRIMARY KEY,
FileData varBinary(max)
)

您需要的是一个页面(在本例中称为“GetFile.aspx”),代码隐藏的Page_Load事件中包含以下内容:

    'Make sure we've got a querystring
    If String.IsNullOrEmpty(Request.QueryString("fileid")) Then
        Throw New ApplicationException("Missing querystring parameter FileId")
    End If
    Dim FileId As Integer
    'Make sure the querystring is an Int
    If Not Integer.TryParse(Request.QueryString("fileid"), FileId) Then
        Throw New ApplicationException("Malformed querystring parameter FileId")
    End If
    'Change YourDsnHere to point to your database
    Using Con As New SqlConnection("YourDsnHere")
        Con.Open()
        'Select the file
        Using Com As New SqlCommand("SELECT * FROM Test WHERE FileId=@FileId", Con)
            Com.CommandType = Data.CommandType.Text
            Com.Parameters.AddWithValue("@FileId", FileId)
            Using RDR = Com.ExecuteReader()
                If RDR.Read Then
                    'Get the data out as a byte array
                    Dim Bytes() = DirectCast(RDR.Item("FileData"), Byte())
                    'Clear all response headers
                    Response.Clear()
                    'Set the type, my sample is a RAR file, you'll need to look up MIME types for yours
                    Response.AddHeader("Content-Type", "application/x-rar-compressed")
                    'Set the name of the file, if you don't set it browsers will use the name of this page which you don't want
                    Response.AddHeader("Content-Disposition", "inline; filename=YourFilenameHere.rar")
                    'Optional but nice, set the length so users get a progress bar
                    Response.AddHeader("Content-Length", Bytes.Count.ToString())
                    'Push the bytes out raw
                    Response.BinaryWrite(Bytes)
                    'Close the response stream so no more HTML gets accidentally pushed out
                    Response.End()
                Else
                    'Error, no file was found
                End If
            End Using
        End Using
        Con.Close()
    End Using

然后在您的页面中,当用户点击该按钮时,将其指向此页面,确保在查询字符串中传递有效的fileid

就像我说的那样,我认为这就是你要找的,如果没有,请澄清你的描述