2011-08-12 155 views
2

我以字节[]格式从数据库中获取文件,并希望用户在Linq从数据库中取出之前查看下载对话框。它在C#和ASP.NET中。现在如何在文件准备好下载之前显示下载对话框?

,是这样的:

  1. 用户选择一个文件,点击它。
  2. 在代码中,我得到点击文件的id并使用我正在下载的Linq。
  3. 然后我通过Response.OutputStream.Write发送文件(content,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(); 
    } 
} 

你是我的希望。

+0

当用户点击“保存”(因为文件没有下载)时应该保存什么? – Mrchief

+0

在开始构建下载之前,您必须输出标题并启动正文。这意味着没有内容长度标题,因为内容尚未在此时建立。 –

+0

您希望用户接受下载两次,第一次选择文件时(通过“模拟文件”),第二次当真正的文件从数据库中加载时?我无法想象这是避免第二个对话的方法,因为否则你可以给他钉他没有要求的东西,这听起来像是一个安全漏洞。 –

回答

1

您的问题就在这里:

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

,因为在这一行你分配在Web服务器的RAM整个文件,并把一切都放在那里,从数据库中文件的所有内容;以后会发生什么并不重要,因为你已经从db下载到这个行的web服务器了!

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

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

+1

找到它,请看这个:http:// stackoverflow。com/questions/6959196 /如何使用asp-net-c即时下载即时版本 –

+0

我会尽力在Streams上做些什么。谢谢 ;)。 我希望我能以某种方式从Linq的数据库流文件。 – Mattaniel