如何在文件准备下载之前显示下载对话框

本文关键字:下载 显示 对话框 文件 | 更新日期: 2023-09-27 18:05:20

我从字节[]格式的数据库中获得一个文件,并希望用户在Linq将从数据库中获取它之前看到下载对话框。c#和ASP.NET。

现在,它是这样的:

  1. 用户选择一个文件,点击它。
  2. 在代码我得到文件的id点击和使用Linq我正在下载。
  3. 然后我通过Response.OutputStream发送文件。写(内容,0,content.Length);
  4. 在从数据库下载文件之前,用户不会看到任何下载对话框。

如果我想让用户在下载文件之前看到下载对话框,我该怎么做?

代码:
按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文件流或类似的东西