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

时间:2011-08-12 20:28:17

标签: c# asp.net linq httpresponse

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

现在,就像这样:

  1. 用户选择一个文件,点击它。
  2. 在代码中我点击了文件的id并使用Linq我正在下载。
  3. 然后我通过Response.OutputStream.Write发送文件(内容,0, content.Length);
  4. 在从数据库下载文件之前,用户将看不到任何文件 下载对话框。
  5. 如果我希望用户在下载文件之前看到下载对话框,该怎么办?

    代码:
    通过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();
        }
    }
    

    你是我的希望。

1 个答案:

答案 0 :(得分:1)

你的问题在这里:

byte[] content = FileService.getFile(fileID);

因为在这一行中你将整个文件分配到Web服务器的RAM中,并将所有内容放在那里,来自数据库的文件的所有内容;后来发生的事情不再重要,因为你已经从db下载到这个系列的Web服务器了!!!

我有这样的Deja-vu因为我确信几周前我在同一个问题上给出了完全相同的评论。现在找不到它,在SO中搜索这样的东西。

实际上解决方案是直接流到Response的输出流,避免上面的byte []数组分配,为了得到这个,你的数据层当然应该支持它,如果没有,你可以为此添加一个方法。您想使用SQL Server文件流或类似的东西。