使用c#asp.net从sql下载blob文件,并向用户显示保存对话框
本文关键字:用户 显示 对话框 保存 文件 net c#asp sql blob 下载 使用 | 更新日期: 2023-09-27 18:30:12
我已经在网上搜索了几个小时了。尽管将blob文件上传到sql数据库似乎很容易,但再次下载它却是一场噩梦。
我有一个显示记录的网格视图。网格视图有一个链接按钮,我想用它来下载一个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);
}
}
}
我知道在我的代码中,我实际上为文件设置了一个下载位置。但是我如何更改它,这样用户就会被问到在哪里保存文件?
我认为您可以简单地将数据写入响应(未测试),类似于:
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;
}