我有一个存储一些文档的SQL数据库。
用户可以登录该应用程序,并查看其文档列表。
在文档的gridview中单击链接按钮下载时,我从数据库中获取文件,将其写入文件系统,然后执行此代码。
System.IO.FileInfo file = new System.IO.FileInfo(System.Configuration.ConfigurationManager.AppSettings["UploadPath"] + DocumentName);
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.Cookies.Clear();
Response.Cache.SetCacheability(HttpCacheability.Private);
Response.CacheControl = "private";
Response.Charset = System.Text.UTF8Encoding.UTF8.WebName;
Response.ContentEncoding = System.Text.UTF8Encoding.UTF8;
Response.AppendHeader("Content-Length", file.Length.ToString());
Response.AppendHeader("Pragma","cache");
Response.AppendHeader("Expires", "60");
Response.ContentType = GetContentType(file.Extension);
Response.AppendHeader("Content-Disposition",
"inline; " +
"filename=\"" + file.Name + "\"; " +
"size=" + file.Length.ToString() + "; " +
"creation-date=" + DateTime.Now.ToString("R") + "; " +
"modification-date=" + DateTime.Now.ToString("R") + "; " +
"read-date=" + DateTime.Now.ToString("R"));
我的GetContentType()方法只返回我允许的文件的相应文件类型“application / pdf,application / msw0rd等。
我的问题是,当文件被保存时,它是网页本身,而不是文件系统中的文件。在谷歌浏览器中,它在文件名的末尾添加.htm扩展名,我猜是因为它知道它是一个网页?
无论如何,第一步是获取实际文件,而不是他们所在的HTML网页副本!
感谢。
答案 0 :(得分:9)
而不是
Response.AppendHeader( “内容处置”, “内联;”+ “文件名=
使用
Response.AddHeader(“content-disposition:”,“attachment; filename =
答案 1 :(得分:9)
你如何发送文件的实际内容?
我通常使用Response.TransmitFile方法,它基本上打开文件并将其内容发送到Response.OutputStream
答案 2 :(得分:3)
您是否尝试将内容处置设置为“附件”而不是“内联”?我相信浏览器会提示用户打开或保存文档。
此外,您通常可以通过使用BinaryWrite方法将数据库中的字节流直接写入Response对象来绕过文件系统...这也是您可能希望使用HTTP处理程序进行调查的情况。 ASPX页面,以便您不必担心清除响应等。我过去已经成功使用页面上的隐藏iframe,然后使用Javascript将其src设置为采用文档ID的HTTP处理程序作为QueryString的参数。