Expressjs:res.download期间图像文件编码问题
Expressjs : issue with image file encoding during res.download
我有一个非常普通的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详细信息。
- 将包含SVG元素的HTML转换为图像文件
- 由多个图像文件组成的响应地图
- 使用文件夹路径名保存所有图像文件和文件名
- 如何将 html5 画布另存为窗口 8 Metro 应用程序中的图像文件
- 将图像文件存储在猫鼬模式中的二进制数据中,并以html形式显示图像
- 如何使用heatmap.js保存canvas标记生成的图像文件
- 如何使用html / angularjs保存图像文件
- 如何从 HTML 或 Javascript for Windows Phone 访问图像文件
- 在 Windows 现代(地铁)UI 应用中存储图像文件和音频文件的方法是什么?
- 节点 js 流星 js 图像文件上传图像损坏
- 从图像URL javascript html保存图像文件
- 如何使用AJAX读取图像文件并渲染到Canvas
- 浏览器和大量的图像文件处理
- 什么错误I'我在下面的jQuery代码中集成filepicker.io来上传一个图像文件
- 节点:将 base64 源写入图像文件
- 如何将图像文件以及JavaScript变量的值上传到服务器和数据库
- 如何从本地文件夹(磁盘存储)读取或获取图像文件,并使用nodejs服务器将其发送到Angularjs
- 如何使用expressnodejs上传图像文件并进行显示
- 如何用我在HTML5画布上绘制的src保存图像文件
- 图像文件因websocket文件传输而损坏