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

如何将上传文件转换为Buffer/Blob/二进制?Node.js后端实现

问题:Node.js服务端直接转发上传文件至外部API(需转成Buffer/二进制)

我的当前代码如下:

const axios = require('axios').default
import FormData from 'form-data'
import fs from 'fs'

export default class MyController {
  public async handleMultipleFile({ request }: HttpContextContract) {
    if(request.files('files').length > 0){
      const formData = new FormData()
      
      for( let i = 0; i < request.files('files').length; i++ ) {
        let file = request.files('files')[i]
        formData.append('files[' + i + ']', file)
      }

      axios.post(`https://example-api.com/assets/files`, formData, {
          headers: {
              'Content-Type': 'multipart/form-data'
          },
        }
      ).then(res => console.log(res.data))
      .catch(err => console.error(err))
    }
  }
}

request.files('files')返回的文件对象结构:

{
    "fieldName": "files[]",
    "clientName": "test.xlsx",
    "size": 8212,
    "type": "application",
    "extname": "xlsx",
    "subtype": "vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    "state": "consumed",
    "isValid": true,
    "validated": true,
    "errors": [],
    "meta": {}
}

需求说明:文件上传后不保存到本地,要直接转发给外部API。但当前代码直接把文件对象传给FormData不行,服务端FormData要求文件是Buffer/二进制格式,请问怎么解决?


解决方案

在Node.js环境下,你可以通过文件对象的read()方法获取文件的Buffer数据,然后将Buffer传入FormData,同时指定文件名和MIME类型,确保外部API能正确解析。

修改后的代码如下:

const axios = require('axios').default
import FormData from 'form-data'

export default class MyController {
  public async handleMultipleFile({ request }: HttpContextContract) {
    const files = request.files('files')
    if(files.length === 0) return

    const formData = new FormData()
    
    for (let i = 0; i < files.length; i++) {
      const file = files[i]
      // 读取文件为Buffer
      const fileBuffer = await file.read()
      // 向FormData添加文件Buffer,同时指定文件名、MIME类型
      formData.append(`files[${i}]`, fileBuffer, {
        filename: file.clientName,
        contentType: `${file.type}/${file.subtype}`
      })
    }

    try {
      const res = await axios.post('https://example-api.com/assets/files', formData, {
        // 直接使用FormData生成的headers,避免手动设置导致的边界符问题
        headers: formData.getHeaders()
      })
      console.log(res.data)
    } catch (err) {
      console.error(err)
    }
  }
}

关键修改点说明:

  • 使用await file.read()获取文件的Buffer数据:这是AdonisJS(从HttpContextContract可判断框架)中文件对象提供的方法,能直接读取已上传文件的二进制内容,无需保存到本地。
  • 向FormData添加Buffer时指定filename和contentType:这两个参数能让外部API正确识别文件的名称和类型,避免解析失败。
  • 使用formData.getHeaders()设置请求头:手动设置multipart/form-data会丢失FormData自动生成的边界符(boundary),导致请求解析错误,直接用getHeaders()能自动包含正确的边界信息。
  • 改用async/await替代then/catch:让代码逻辑更清晰,符合Node.js异步代码的现代写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 08:45:28