Expressjs:res.download期间的图像文件编码问题

我有一个非常普通的node.js服务器,expressjs在本地安装用于开发目的; 我存储各种文件,并通过基本的HTTP调用请求它们,通过快速的res.downloadfunction返回文件。 大多数情况下,这个工作没有困难。 然而,对于非常小的文件子集,最终用户收到的文件比预期的要大得多(几乎是2倍),而且任何传统的查看器都无法读取。 可能有一百个文件,这只发生了两次,都是JPG文件,但样本太小,不能得出任何结论。 我知道的 :

  • 这个问题是可复制的:如果它发生在一个文件,它总是发生;
  • 问题与文件存储方式无关:如果将有问题的文件与另一个文件交换,但保留其他所有内容(名称,位置等),则工作正常;
  • 在res.download发生之前,文件是好的:用fs.stats检查它的大小返回正确的值
  • HTTP响应遇到不可见的问题:没有错误,200响应代码…
  • 源文件似乎有正常的元数据和JPG标记

更新我做了一些testing,并且这个问题似乎与编码有关 :被破坏的响应文件由于未知的原因而以UTF-8编码; 所有非UTF-8字符被EF BF BD (未知的字符符号)替代时,大小不一致! 我仍然无法理解为什么会发生这种情况,是什么使这几个文件与其他文件不同,以及是否能够在上游进行检测和/或纠正。

更新2经过一些额外的testing,我仍然不能确定原因,但我可以添加以下信息:

  • 系统方面,问题发生在fs.js中的数据stream中

  • 根本原因位于图像EXIF数据中的某处

对于那些感兴趣的,可以在这里find源图像(source.JPG)和下载结果(response.JPG): http : //www.sycomor.fr/test/ ; 我也添加了一个不受下载影响的类似图像,并且干净。 对于什么是值得的,两张照片分开拍摄,相同的设置相同的照相机,所以我坚信这个问题是由一些外部来源造成的。

谢谢 !

您的问题来自快速configuration中的“connect-livereload”。 它注入重新加载脚本时,破坏二进制stream。

有关详细信息,请参阅https://github.com/intesso/connect-livereload/issues/39