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

如何用Node.js+Axios+form-data直接发送大文件子缓冲区至服务器

解决Node.js中通过Axios+form-data直接发送子缓冲区(无需存磁盘)的问题

你之前的代码问题出在调用了Readable.from(chunk).read()——这个方法会直接读取流的内容返回Buffer,而form-data需要接收的是可读流对象,不是已经读取出来的buffer内容。直接传递Readable流实例即可,无需先写入磁盘。

正确实现代码

import fs from 'fs';
import FormData from 'form-data';
import { Readable } from 'stream';
import axios from 'axios';

async function sendFileChunk(filePath, start, end) {
  // 读取文件到缓冲区,提取指定子范围的chunk
  const buffer = fs.readFileSync(filePath);
  const chunk = buffer.slice(start, end);

  // 构建form-data表单
  const formData = new FormData();
  // 直接传入Readable流对象,无需调用read()
  formData.append('file', Readable.from(chunk), {
    filename: 'chunk-file', // 可选:给服务器端的文件名
    contentType: 'application/octet-stream' // 可选:指定文件MIME类型
  });

  try {
    // 发送请求,必须携带form-data的headers
    const res = await axios.post('你的服务器上传接口', formData, {
      headers: {
        ...formData.getHeaders(),
        // 可添加其他自定义请求头
      },
      // 可选:监听上传进度
      onUploadProgress: (e) => {
        const progress = Math.round((e.loaded / e.total) * 100);
        console.log(`上传进度:${progress}%`);
      }
    });
    console.log('上传成功:', res.data);
  } catch (err) {
    console.error('上传失败:', err);
  }
}

// 调用示例:发送文件的第0到1024字节
sendFileChunk('/path/to/your/large/file', 0, 1024);

关键注意点

  1. 传递流对象而非buffer内容:Readable.from(chunk)返回的是可读流实例,直接传给formData.append()即可,form-data会自动处理流的读取逻辑。
  2. 必须设置form-data请求头:Axios需要识别form-data的边界(boundary),所以一定要通过formData.getHeaders()获取并合并到请求头中。
  3. 超大文件优化:如果原文件体积极大,fs.readFileSync会把整个文件加载到内存,可能引发内存溢出。此时可以直接创建指定范围的文件流,无需加载整个文件:
// 优化方案:直接从文件流截取指定范围,内存占用更低
const fileStream = fs.createReadStream(filePath, { start, end });
formData.append('file', fileStream, { filename: 'large-file-chunk' });

内容的提问来源于stack exchange,提问作者yyjazsf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:30:46