我有一个页面,当用户点击按钮时,会动态生成PDF并供他们下载。
这是允许用户下载pdf的代码:
// Omitted code that generates the pdf bytes
response.ContentType = "application/octetstream";
response.AppendHeader("Content-Disposition", "attachment; filename=" + filename);
response.BinaryWrite(pdfBytes);
response.End();
在我的机器和许多其他人使用Chrome,IE 7/8 / 9b和Firefox的混合物上,这是按预期工作的;用户单击该按钮,PDF将被下载。
在IE7的某些实例中,我们的用户报告他们收到错误消息:
“Internet Explorer无法从thesite.com下载Publish.aspx
Internet Explorer无法打开此Internet站点。请求的网站要么不可用,要么找不到。请稍后再试“。
Publish.aspx是按钮所在的页面,因此页面 可用。 IE应该下载pdf。
上述代码是否有任何错误可能导致某些机器出现此问题?或者是特定的安全/操作系统/浏览器设置?
编辑:
这些是来自fiddler的响应头:
HTTP/1.1 200 OK
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Content-Type: application/octetstream
Expires: -1
Server: Microsoft-IIS/7.5
Content-Disposition: attachment; filename=myPdf.pdf
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Date: Fri, 12 Nov 2010 09:48:06 GMT
Content-Length: 45772
答案 0 :(得分:3)
这可能是因为正确的mime类型是application/octet-stream
,而不是application/octetstream
。
答案 1 :(得分:2)
尝试使用Response.OutputStream
filepath= Server.MapPath(filepath);
FileStream strm = new FileStream(filepath, FileMode.Open, FileAccess.Read);
byte[] fileByte = new byte[strm.Length];
int x = strm.Read(fileByte, 0, fileByte.Length);
Response.Clear();
Response.AddHeader("Accept-Header", fileByte.Length.ToString());
Response.AddHeader("Content-Disposition","inline; filename=" + filename);
Response.ContentType = "application/pdf";
Response.OutputStream.Write(fileByte, 0, fileByte.Length);
Response.Flush();
strm.Close();
,您的内容类型必须为=“application / pdf”
答案 2 :(得分:2)
最近我碰到了同样的错误。在我的情况下,我使用https而不是缓存。 IE中的安全功能似乎是不下载文件。来自EricLaw的IEInternals:
如果用户尝试通过HTTPS连接下载*文件,则任何阻止缓存的响应头都将导致文件下载过程失败。
答案 3 :(得分:1)
Nicolas说“octetstream”(没有破折号)不是已知的MIME Type是正确的。
我建议使用application/pdf
。
答案 4 :(得分:0)
如果您使用response.TransmitFile
/ response.WriteFile
?
答案 5 :(得分:0)
好的,我已将内容类型更正为application / octet-stream并更改了缓存。它似乎是一个IE + SSL问题,因此我会在今晚晚些时候部署它时发现它是否有效。谢谢您的帮助。
答案 6 :(得分:-2)
在类似问题的google解决方案中找到:
Response.AppendHeader('Expires', 'Sun, 17 Dec 1989 07:30:00 GMT');