为什么图像没有完全显示与我的stream应用程序?

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

这里是一个例子,图片的底部在左侧丢失。

在这里输入图像描述

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

该应用程序的代码是在Github上 ,但我想重要的线是

stream = fs.createReadStream(info.file, { flags: "r", start: info.start, end: info.end }); stream.pipe(res); 

(所有的繁重工作都是由stream.js完成的,而不是我的代码。)

  • 我已经尝试删除开始和结束参数,但没有区别。
  • 如果将其更改为将文件stream式传输到process.stdout ,并将输出保存到文件,则会显示整个图像。
  • 一个文件比较程序说stdout和原来的文件是一样的。
  • 如果我转移除基线jpeg以外的东西(所以即使渐进式jpegs工作),它显示整个文件。
  • 如果我通过链接的Node.js应用程序(使用Express)访问文件,但不通过stream式传输器,它显示整个图像。
  • 如果我从浏览器中将不完整的图片保存到桌面,则会保存整个图像。
  • 对于一些JPEG的作品,但不是最。
  • 这个问题发生在本地和我的服务器上(Windows 2008 R2和Ubuntu 11)。

浏览器testing(超过3台计算机和1个虚拟机)

  • Safari 4,5 – 作品
  • 火狐4,11(2电脑) – 不起作用
  • Chrome 18(2台电脑) – 不起作用
  • IE 8 – 不起作用
  • IE 9 – 作品
  • 歌剧11 – 作品

我真的不知道这里发生了什么事。 我认为这可能是一个奇怪的graphics驱动程序错误,但行为是所有我试过的电脑一致。 我发现很难指责Node.js /我的代码,因为它似乎是传输整个文件,但它没有它的工作正常。

如果需要,很乐意提供更多细节。

*显然,我没有尝试过所有可能的文件types,但是PNG,渐进式JPEG,文本和video似乎工作。

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