为什么我的流式应用程序无法完全显示图像?

时间:2012-04-19 15:35:14

标签: node.js http-headers streaming video-streaming jpeg

我写了一个简单的Node.js应用程序来传输内容(主要用于视频,但其他东西也有效)。它似乎工作得很好,除了一些jpegs,其中图像的底部并不总是显示。

这是一个例子,左边缺少图片的底部。

enter image description here

显示问题的网站是here,没有问题的外观相同的网站是here。 (第一个链接的大多数图像底部应该有粉红色的位。)

该应用的代码为on 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个VM)

  • Safari 4,5 - 作品
  • Firefox 4,11(2台计算机) - 无法正常工作
  • Chrome 18(2台计算机) - 无效
  • IE 8 - 无法正常工作
  • IE 9 - 作品
  • Opera 11 - 作品

我真的不知道这里发生了什么。我认为它可能是一个奇怪的图形驱动程序错误,但行为在我尝试过的所有计算机上都是一致的。我发现很难将Node.js /我的代码归咎于此,因为它似乎正在传输整个文件,但是没有它就可以正常工作。

如果需要,很高兴提供更多详细信息。

*显然我没有尝试过所有可能的文件类型,但是png,渐进式jpeg,文本和视频似乎都有效。

1 个答案:

答案 0 :(得分:0)

事实证明,问题是标题(header["Content-Length"])中发送的文件大小。我将其设置为info.end - info.start,而实际大小为1。有些浏览器不喜欢这样,在屏幕上显示时错过了图片的结尾。哎呀。