Buffer.byteLength与文件大小不符:如何获取正确上传文件大小?
上传文件后Buffer大小远小于实际文件大小的问题排查与解决
问题背景
本地Finder显示文件原始大小为 51,534,849 bytes(约51MB),但通过Postman上传至使用express-fileupload的Node.js服务器后,fileUpload.data的byteLength仅为18118252(约17MB),远小于实际大小。
可能原因及对应解决方案
1. Postman开启了压缩上传
Postman若手动开启Send compressed requests选项,服务器收到的会是经过gzip压缩后的Buffer,自然远小于原始文件大小。
解决步骤:
- 点击Postman请求右上角的齿轮图标打开请求设置
- 取消勾选
Send compressed requests选项 - 重新上传文件,验证Buffer大小是否恢复正常
2. 服务器未处理压缩请求
如果需要保留请求压缩优化传输速度,需在服务器端对gzip压缩的Buffer解压后获取原始大小:
import zlib from 'zlib'; import { UploadedFile } from "express-fileupload"; private async getOriginalFileSize(fileUpload: UploadedFile): Promise<number> { let fileData = fileUpload.data; // 检测是否为gzip压缩格式(gzip文件头标识为0x1f 0x8b) const isGzipCompressed = fileData[0] === 0x1f && fileData[1] === 0x8b; if (isGzipCompressed) { // 异步解压gzip内容 fileData = await new Promise<Buffer>((resolve, reject) => { zlib.gunzip(fileData, (err, decompressedBuffer) => { if (err) reject(err); resolve(decompressedBuffer); }); }); } return fileData.byteLength; }
3. express-fileupload配置限制文件大小
若服务器端express-fileupload的limits.fileSize配置过小,会导致文件被截断,获取到的Buffer仅为文件的一部分。
解决方法:
初始化express-fileupload时设置足够大的文件大小限制:
import express from 'express'; import fileUpload from 'express-fileupload'; const app = express(); app.use(fileUpload({ limits: { fileSize: 100 * 1024 * 1024 // 设置为100MB,可根据实际需求调整 }, useTempFiles: false, preserveExtension: true }));
4. 文件完整性验证
若上述方法无效,可验证上传文件的完整性:
- 将服务器收到的Buffer保存为本地文件:
import fs from 'fs/promises'; await fs.writeFile('./uploaded-test-file', fileUpload.data); - 对比原始文件与保存后文件的MD5哈希值,若不一致则说明上传过程中文件被截断,需检查Postman配置或网络稳定性。
内容的提问来源于stack exchange,提问作者chibis
相关产品推荐
相关产品推荐

