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

时间:2014-09-30 14:23:28

标签: javascript node.js image express encoding

我有一个非常普通的node.js服务器,本地安装了expressjs用于开发目的;我存储各种文件并通过基本HTTP调用请求它们,该调用通过express'res.download功能返回文件。大部分时间,这都顺利进行。然而,对于非常小的文件子集,最终用户接收的文件比预期的大得多(几乎是2倍),并且任何传统的观看者都无法读取。可能有一百个文件,这只发生过两次,都是JPG文件,但样本太小而无法得出任何结论。我所知道的:

  • 问题是可以重现的:如果它与文件一起发生,它总会发生;
  • 问题与文件的存储方式无关:如果我将有问题的文件与另一个文件交换但保持其他一切(名称,位置等),它可以正常工作;
  • 在res.download发生之前,文件没问题:用fs.stats检查其大小会返回正确的值
  • HTTP响应遇到没有明显问题:没有错误,200响应代码......
  • 源文件似乎具有普通元数据和JPG标记

更新我做了一些测试,问题似乎与编码有某种关系:由于原因未知,错误的响应文件以UTF-8编码;大小差异来自所有被EF BF BD(未知字符符号)替换的非UTF-8字符!我仍然无法理解它为什么会发生,是什么让这些文件与其他文件不同,以及是否可以在上游检测和/或纠正它们。

更新2 经过一些额外的测试,我仍然无法确定原因,但我可以添加以下信息:

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

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

对于那些感兴趣的人,可以在这里找到源图像(source.JPG)和下载结果(response.JPG):http://www.sycomor.fr/test/;我还添加了一个不受下载影响的类似图像,并且干净利落。对于它的价值而言,两张照片是相隔几分钟拍摄的,相同的相机设置相同,所以我强烈怀疑这个问题是由一些外部资源引起的。

谢谢!

1 个答案:

答案 0 :(得分:2)

您的问题来自快速配置中的“connect-livereload”。 它在注入重载脚本时会破坏二进制流。

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