如何在文件准备下载之前显示下载对话框
本文关键字:下载 显示 对话框 文件 | 更新日期: 2023-09-27 18:05:20
我从字节[]格式的数据库中获得一个文件,并希望用户在Linq将从数据库中获取它之前看到下载对话框。c#和ASP.NET。
现在,它是这样的:
- 用户选择一个文件,点击它。
- 在代码我得到文件的id点击和使用Linq我正在下载。 然后我通过Response.OutputStream发送文件。写(内容,0,content.Length);
- 在从数据库下载文件之前,用户不会看到任何下载对话框。
如果我想让用户在下载文件之前看到下载对话框,我该怎么做?
代码:
按id获取文件:
public static byte[] getFile(Guid id)
{
var linqFile = from file in MyDB.Files
where file.IdPliku.Equals(id)
select new
{
Content = file.Content
};
return linqFile.ToList().FirstOrDefault().Content.ToArray();
}
拯救文件:public void SaveFile(Guid fileID, string filename, string mimeTypes)
{
try
{
byte[] content = FileService.getFile(fileID);
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = mimeTypes;
Response.AppendHeader("Accept-Ranges", "bytes");
Response.AppendHeader("Content-Range", string.Format("0-{0}/{1}", content.Length, content.Length));
Response.AppendHeader("Content-Length", content.Length.ToString());
Response.AppendHeader("Content-Encoding", "utf-8");
Response.AppendHeader("Content-Type", Response.ContentType);
Response.AppendHeader("Content-Disposition", "attachment; filename= " + HttpUtility.UrlEncode(filename));
Response.OutputStream.Write(content, 0, content.Length);
//Response.BinaryWrite(content);
Response.Flush();
}
finally
{
Response.Close();
}
}
你是我的希望。
你的问题在这里:
byte[] content = FileService.getFile(fileID);
,因为在这一行你分配了整个文件在web服务器的RAM中,把所有的东西都放在那里,文件的所有内容都来自数据库;以后发生什么并不重要了,因为你已经从db下载到web服务器在这一行!!
我有这种似曾相识的感觉,因为我确信几周前我对同样的问题给出了完全相同的评论。现在找不到,在SO中搜索类似的内容。
事实上,解决方案是直接流到响应的输出流,避免上面的byte[]数组分配,为了得到这个,你的数据层当然应该支持它,如果它不支持,你可以为此添加一个方法。你想使用SQL Server文件流或类似的东西