You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 08:54:18