[Node.js] 二进制文件经过axios请求后发生变化
这是一段搭建本地服务器并发送请求的 node.js 代码:程序代码:
const fs = require('fs') const { Buffer } = require('node:buffer') const axios = require('axios').default const express = require('express') let app = express() // 此处输出了文件原本的二进制信息 console.log('Local file buffer: ') console.log(fs.readFileSync('a.zip')) app.get('/', (req, res) => { res.sendFile('a.zip', { root: __dirname }) }) app.listen(3000, () => { axios({ method: 'get', url: 'http://127.0.0.1:3000/' }).then((res) => { // 此处输出请求后得到的信息,显然本应和上面的信息一致 console.log('Buffer from the request: ') console.log(Buffer.from(res.data)) }) })
其中 a.zip 是本地的一个压缩包,里面只有一个空的 a.txt 文件用于测试,见
a.zip
(144 Bytes)
然而在我的电脑(系统为 Windows10)上两次输出并不相同,输出如下:
程序代码:
Local file buffer: <Buffer 50 4b 03 04 0a 00 00 00 00 00 6b 9f 0a 57 00 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 61 2e 74 78 74 50 4b 01 02 3f 00 0a 00 00 00 00 00 6b 9f 0a ... 94 more bytes> Buffer from the request: <Buffer 50 4b 03 04 0a 00 00 00 00 00 6b ef bf bd 0a 57 00 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 61 2e 74 78 74 50 4b 01 02 3f 00 0a 00 00 00 00 00 6b ... 108 more bytes>
其中 9f 变成了 ef bf bd,其省略部分应该还有不同。
我猜测这是由编码不同导致,所以将请求得到的字符串由 utf8 转换成 gbk 后再输出,结果为:
程序代码:
Local file buffer: <Buffer 50 4b 03 04 0a 00 00 00 00 00 6b 9f 0a 57 00 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 61 2e 74 78 74 50 4b 01 02 3f 00 0a 00 00 00 00 00 6b 9f 0a ... 94 more bytes> Buffer from the request: <Buffer 50 4b 03 04 0a 00 00 00 00 00 6b 3f 0a 57 00 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 61 2e 74 78 74 50 4b 01 02 3f 00 0a 00 00 00 00 00 6b 3f 0a ... 94 more bytes>
长度虽然相同,但是 9f 变成了 3f。
请问这种问题由何造成,能否通过修改客户端的代码(即 axios 请求部分)来正确地获取文件呢?如果必须修改服务端逻辑,又该如何修改?
[此贴子已经被作者于2023-8-11 19:42编辑过]