我继承了一个允许用户下载pdf的.net应用程序。现在,我可以在本地运行时下载pdf文件但是当我部署到IIS服务器时遇到问题。该下载适用于Firefox但不适用于Chrome,有时也适用于IE。我可以在我的本地开发环境中下载它的事实告诉它可能是IIS配置或我的代码。 pdf作为varbinary存储在ms sql server 2012表中。我在下面提供了一些用于读取数据的代码。如果您还需要其他信息,请与我们联系。此外,我检查了iis日志,我得到了200个状态代码。那里什么都没有。
if(Session["DetailID"] != null)
{
//get the file
DataTable dt = sp_Attachment_Download(lblAttachmentIDD.Text);
DataRow row = dt.Rows[0];
string name = (string)row["AFileName"];
string contentType = (string)row["AFileType"];
Byte[] data = (Byte[])row["AFile"];
/// Send the file to the browser
Response.AddHeader("Content-type", contentType);
Response.AddHeader("Content-Disposition", "attachment; filename=" + name);
Response.BinaryWrite(data);
Response.Flush();
Response.Close();
}
EDITED ---------- 我正在使用IE和Chrome的开发者工具,并发现了一些有趣的东西。当我点击链接时,Chrome会给我以下错误:
interpreted as Document but transferred with MIME type application/pdf:
IE不会出错,但引起了我的注意。我的REQUEST标题,ACCEPT不包含application / pdf,RESPONSE Content-Type有application / pdf。这可能是什么?如何设置ACCEPT以在aspx页面中包含application / pdf?
答案 0 :(得分:0)
从chrome下载pdf时我有类似的问题,因为在我的情况下,文件名中有逗号,而且Chrome显然不喜欢它,所以我从文件名中删除了逗号并且它有效。
PS:请尽量不要使用Response.Close()
。它中止线程并抛出异常。
Response.Clear();
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment; filename=" + fileName.Replace(",",,");
Response.CacheControl = "No-cache";
Response.Write(data);
Response.Flush();
Response.SuppressContent = true;
HttpContext.Current.ApplicationInstance.CompleteRequest();
答案 1 :(得分:0)
也许这会有所帮助,这是我的代码做同样的事情。我注意到的一件事是你没有指定文件长度,我认为这是必需的。请注意,pFileData是包含FileName,一个字符串和FileData的类,一个byte []。
System.Web.HttpResponse Response = System.Web.HttpContext.Current.Response;
Response.Clear();
Response.ClearHeaders();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment;filename=" + pFileData.FileName);
Response.AddHeader("Content-Length", pFileData.FileData.Length.ToString());
Response.BufferOutput = false;
Response.BinaryWrite(pFileData.FileData);
Response.Flush();
Response.SuppressContent = true;
HttpContext.Current.ApplicationInstance.CompleteRequest();
Response.End();