3

我编写了一个简单的 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、文本和视频似乎都可以。

4

1 回答 1

0

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

于 2012-04-20T17:47:09.640 回答