我从byte []格式的数据库中获取文件,并希望用户在Linq从数据库中获取之前看到下载对话框。它在C#和ASP.NET中。
现在,就像这样:
如果我希望用户在下载文件之前看到下载对话框,该怎么办?
代码:
通过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 :(得分:1)
你的问题在这里:
byte[] content = FileService.getFile(fileID);
因为在这一行中你将整个文件分配到Web服务器的RAM中,并将所有内容放在那里,来自数据库的文件的所有内容;后来发生的事情不再重要,因为你已经从db下载到这个系列的Web服务器了!!!
我有这样的Deja-vu因为我确信几周前我在同一个问题上给出了完全相同的评论。现在找不到它,在SO中搜索这样的东西。
实际上解决方案是直接流到Response的输出流,避免上面的byte []数组分配,为了得到这个,你的数据层当然应该支持它,如果没有,你可以为此添加一个方法。您想使用SQL Server文件流或类似的东西。