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

Expressjs : issue with image file encoding during res.download

本文关键字:图像 文件 编码 问题 res download Expressjs      更新时间:2023-09-26

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

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

UPDATE我做了一些测试,这个问题似乎与编码有关:由于未知原因,损坏的响应文件是用UTF-8编码的;大小差异来自于所有非UTF-8字符被CCD_ 1(未知字符符号)替换!我仍然不明白为什么会发生这种情况,是什么让这几个文件与其他文件不同,以及是否可以在上游检测和/或更正。

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

  • 从系统角度来看,该问题发生在fs.js 中的数据流期间

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

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

谢谢!

您的问题来自express配置中的"connect livereload"。它在注入重新加载脚本时破坏二进制流。

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