Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Internet explorer 为什么internet explorer无法使用NodeJS和Express下载PDF?_Internet Explorer_Node.js_Pdf_Ssl - Fatal编程技术网

Internet explorer 为什么internet explorer无法使用NodeJS和Express下载PDF?

Internet explorer 为什么internet explorer无法使用NodeJS和Express下载PDF?,internet-explorer,node.js,pdf,ssl,Internet Explorer,Node.js,Pdf,Ssl,我有一个使用NodeJS构建的网站,需要提供一些PDF(以及其他文件) 由于我无法确定的原因,InternetExplorer8将无法在AcrobatViewer中第一次完全下载PDF(有时会多次)。直接保存文件效果很好,但这并不理想。Chrome运行良好,尽管我还没有测试过其他浏览器 除状态栏停止更新并显示以下内容外,没有错误消息: (来源:) 我通过NodeJS和Express(v3,beta2)/Connect框架(为文件提供服务的是Connect静态中间件)为文件提供服务。我也通过SS

我有一个使用NodeJS构建的网站,需要提供一些PDF(以及其他文件)

由于我无法确定的原因,InternetExplorer8将无法在AcrobatViewer中第一次完全下载PDF(有时会多次)。直接保存文件效果很好,但这并不理想。Chrome运行良好,尽管我还没有测试过其他浏览器

除状态栏停止更新并显示以下内容外,没有错误消息:
(来源:)

我通过NodeJS和Express(v3,beta2)/Connect框架(为文件提供服务的是Connect静态中间件)为文件提供服务。我也通过SSL为文件提供服务,但关闭此选项似乎没有帮助

任何想法都将不胜感激! 谢谢

编辑-包括更多详细信息:

首先-我已经从Express v2升级到了v3,试图解决这个问题-没有这样的运气

这是为文件提供服务的应用程序路径。静态服务组件确实可以工作,因此问题似乎在IE如何检索文件或express如何将文件提供给IE的某个方面

app.get('/store/*', ensureAuthenticated, express.static(__dirname + '/../uploads'));

function ensureAuthenticated(req, res, next) {
    if (req.isAuthenticated()) {    
        return next();
    }
} else {
    res.redirect('/login');
}
至于错误-我在IE中没有看到404错误或任何东西。它只是挂在一个空白屏幕上,上面的图像显示了左下角状态栏中的下载量。Adobe最终(大约5分钟后)失败,并发出警告:“此文件已损坏,无法修复”。我知道文件没有损坏,因为IE偶尔会加载它(参见下面的Fiddler请求)

在《小提琴手》中,我看到了以下内容。

前两个请求失败,而第三个请求成功提交了PDF


如果还有什么我可以提供的,请告诉我。

因此,我解决了问题(或者至少找到了解决方案或4)

我花了一段时间,做了大量的研究、测试用例和各种各样的工作,但我最终还是做到了

当IE8(可能还有其他浏览器,但我还没有进行过广泛的测试)使用Adobe9(未经AdobeX或任何其他版本验证)插件请求PDF时,偶尔它会将整个文件作为一个文件获取。这是我看到的成功,对应于上面Fiddler屏幕截图中的请求22。如果文件很小,它似乎可以抓取整个文件,但在本例中,我使用的是16MB PDF

在其他情况下,Adobe将发送此表单的范围标头:

Range: bytes=a-b, c-d
其中a-b是一个范围,c-d是一个范围,它看起来是不连续的

我对范围标头的了解不是很全面,所以我不确定这是否有效。我所做的研究表明并非如此

无论如何,在Connect的static.js中,它在lib/util.js中使用了一个称为parseRange的范围解析方法。此方法返回以下形式的范围数组:

[
   { start: a, end: b },
   { start: c, end: d}
]
在static.js中,它调用此方法并将值分配给范围,然后使用范围[0]计算范围,从而忽略值c和d。a和b之间的范围是从文件读取并发送到请求的唯一数据

我相信Adobe9会继续等待更多的数据,这导致了我所看到的挂起

解决方案

  • 最简单的解决方案是删除static.js中的标题“Accept Ranges”
  • 我实现的一个更复杂(但不一定正确)的解决方案是取最小值A和c,最大值b和d来创建一个新范围,并在范围检查代码中返回该范围。以下要点显示了我所做的工作:
  • 我认为第三个(可能的)解决方案是监视客户端何时一直在等待数据,并对连接进行处理(关闭连接,发送更多数据,我不确定!)。我真的不知道这将如何工作,但我会尝试把它推荐给可能的人

第二种解决方案适用于我的用例。我希望如果你偶然发现它,它也会对你有用

不知道我们如何在没有任何代码的情况下帮助您。。。请参阅常见问题解答:考虑运行小提琴,看看实际发生的网络流量在那一点。是代码示例是必要的。一些随机想法是检查从节点返回的mime/类型。提琴手可以帮上忙。你说的“失败”是什么意思?它是404吗?杂技演员认为它腐败吗?还有什么?请输入密码,我很乐意看一看