我编写了一个简单的 Node.js 应用程序,用于流式传输内容(主要用于视频,但其他内容也可以)。它似乎工作正常,除了一些 jpeg,图像的底部并不总是显示。
这是一个示例,左侧缺少图片的底部。
显示问题的站点在此处,而没有问题的外观相同的站点在此处。(第一个链接的大多数图像底部应该有粉红色的位。)
该应用程序的代码在 Github 上,但我想重要的几行是
stream = fs.createReadStream(info.file, { flags: "r", start: info.start, end: info.end });
stream.pipe(res);
(所以所有繁重的工作都是由 stream.js 完成的,而不是我的代码。)
- 我试过删除开始和结束参数,但这没有什么区别。
- 如果我将其更改为流式传输文件
process.stdout
并将输出保存到文件中,则会显示整个图像。 - 文件比较程序说来自的文件
stdout
和原始文件是相同的。 - 如果我传输基线 jpeg 以外的其他内容(因此即使是渐进式 jpeg 也可以),它会显示整个文件。*
- 如果我通过链接的 Node.js 应用程序(使用 Express)而不是通过流媒体访问该文件,它会显示整个图像。
- 如果我将浏览器中的不完整图片保存到桌面,它会保存整个图像。
- 对于某些 jpeg,它有效,但不适用于大多数。
- 问题发生在本地和我的服务器上(分别是 Windows 2008 R2 和 Ubuntu 11)。
浏览器测试(超过 3 台计算机和 1 台虚拟机)
- Safari 4、5 - 有效
- Firefox 4、11(2 台计算机)- 不起作用
- Chrome 18(2 台计算机)- 不起作用
- IE 8 - 不起作用
- IE 9 - 工作
- 歌剧 11 - 作品
我真的不知道这里发生了什么。我认为这可能是一个奇怪的图形驱动程序错误,但我尝试过的所有计算机的行为都是一致的。我发现很难责怪 Node.js / 我的代码,因为它似乎正在传输整个文件,但是没有它它也能正常工作。
如果需要,很乐意提供更多详细信息。
* 显然我没有尝试过所有可能的文件类型,但 png、渐进式 jpeg、文本和视频似乎都可以。