如何将上传文件转换为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
相关产品推荐
相关产品推荐

