我在其中一个用于PDF文件下载的应用程序中有一些遗留代码(PDF文件大小约为350-400KB),最近我们抱怨(约1%的客户)说PDF下载失败,损坏/损坏文件错误。
以下是代码片段(C ++应用程序)设置标题供下载
String header;
header.append("Content-type: application/force-download\r\n");
header.append("Content-Transfer-Encoding: Binary\r\n");
header.append("Content-length: %d\r\n", filebuf.length());
header.append("Connection: Close\r\n");
header.append("Content-disposition: attachment; filename=%s\r\n\r\n", filename_to_download.chars());
String class和append方法只是一个例子。
我理解上面的标题不是触发PDF文件下载的最佳方式(我通过“Content-Type application / octet-stream和Content-Disposition:attachment; filename = example.pdf”来简化标题,看起来像它为我工作)。
但是我无法理解为什么上面的原始代码不能在1%的时间内工作。
我试图了解浏览器/ adobe组合,但似乎这里没有模式,是的,客户提到的一件事是,当他们改为“Chrome浏览器”时,它大部分时间都有效。
任何指针?
答案 0 :(得分:0)
经过几天的奋斗终于弄明白了这里发生了什么。
我们将内容长度设置为缓冲区大小(pdf文件大小),从我们的代码中将此数据发送到客户端,但是在apache模块之间,mod_gzip / mod_deflate正在压缩数据缓冲区以及到达客户端/浏览器的内容是“内容-Length:100字节“但实际数据是60-70字节。
并非每个浏览器都抱怨这种不匹配,但某些浏览器会将此视为致命错误并显示消息“无法下载文件”(我们在Win8 / IE10和Win8 / IE11中经常看到此问题,可能还有其他一些浏览器安全设置也会在浏览器上造成这种情况!)。
对于此修复程序,我们已从标题中删除了“Content-Length”。