2

我已经在网上搜索了几个小时。尽管将 blob 文件上传到 sql 数据库似乎很容易,但再次下载它却是一场噩梦。

我有一个显示记录的gridview。网格视图有一个链接按钮,我想用它来下载一个 blob 文件,该文件保存在与网格视图加载其数据的位置相同的表中。我正在使用 onclick 事件将记录 ID 传递给我的代码隐藏函数。

这是我点击事件背后的代码

protected void Downloadbutton_Click(Object sender, CommandEventArgs e)
    {

        string reqid = e.CommandArgument.ToString();

        using (SqlConnection connection = new SqlConnection("ConnectionString"))
        {
            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = "Select Attached_File_Name from ABSENCE_REQUEST where Request_ID = @Request_ID";
            cmd.Connection = connection;
            cmd.Parameters.AddWithValue("@Request_ID", Convert.ToInt32(20057));

            byte[] buffer = (byte[]) cmd.ExecuteScalar();
            using (FileStream fs = new FileStream(@"C:\test.pdf", FileMode.Create))
            {
                fs.Write(buffer, 0, buffer.Length);
            }
        }
    }

我知道在我的代码中我实际上为文件设置了下载位置。但是我怎样才能改变它,以便用户会被问到将文件保存在哪里?

4

1 回答 1

4

我认为您可以简单地将数据写入响应(未测试),例如:

private void WriteFile (Byte[] bytes, string fileName)
{
    Response.Buffer = true;
    Response.Charset = "";
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.ContentType = dt.Rows[0]["ContentType"].ToString();
    Response.AddHeader("content-disposition", "attachment;filename=" + fileName);
    Response.BinaryWrite(bytes);
    Response.Flush();
    Response.End();
}

您可能还想考虑为此创建一个通用处理程序,因此您的代码将非常相似,但是您可以拥有指向文件的链接,而不是仅在单击按钮时可用,例如您的链接可能是:

YourWebsite/Downloads/RequestFileHandler.ashx?RequestID=5

下载request_ID为5的文件

编辑

对不起,完全假设这是一个网页,但现在意识到它可能不是,在这种情况下你可以使用类似的东西:

private bool SaveBytesToFile(byte[] butes)
{
    var saveFileDialog = new SaveFileDialog();
    if (saveFileDialog.ShowDialog() != DialogResult.Cancel)
    {
        using (var fileStream = new FileStream(saveFileDialog.FileName, FileMode.Create, FileAccess.Write))
        {
            fileStream.Write(bytes, 0, bytes.Length);
        }
        return true;
    }
    return false;
}
于 2013-09-05T10:31:30.017 回答