如何在Node.js中使用request()发送multipart/form-data调用外部API传输文件
在Node.js中使用request()发送multipart/form-data文件到Laravel
我来帮你搞定这个文件传输的问题!首先得明确:body-parser并不支持解析multipart/form-data格式的请求,所以你需要先换用专门处理文件上传的中间件,再通过request构造对应的请求转发给Laravel项目。
步骤1:安装必要依赖
先安装multer——这是Node.js生态里处理文件上传最常用的中间件:
npm install multer
步骤2:配置multer接收客户端文件
在你的项目里配置multer,用来解析客户端发来的文件。这里用内存存储示例,你也可以根据需求改成磁盘存储:
const multer = require('multer'); // 内存存储:文件暂存在内存中,适合小文件传输 const storage = multer.memoryStorage(); const upload = multer({ storage: storage });
步骤3:改造request调用逻辑
接下来调整你原有的代码,增加multipart请求的处理分支。当客户端上传文件时,用request的formData选项来构造符合要求的请求体:
// 假设你的路由使用multer中间件,接收名为"file"的单个文件字段 app.post('/forward-file', upload.single('file'), (req, res, next) => { const options = { url: 'https://your-laravel-project-url.com/api/receive-file', // 替换成Laravel的文件接收接口 method: req.method, // 构造multipart/form-data请求体 formData: { // 如果有其他普通表单字段,在这里添加 username: req.body.username, // 传递解析后的文件:req.file是multer生成的文件对象 file: { value: req.file.buffer, options: { filename: req.file.originalname, // 保留原文件名 contentType: req.file.mimetype // 保留原文件类型 } } } }; // 保留你原有的request回调逻辑 request(options, function(error, response, body) { if (error || ![constants.response_codes.success, constants.response_codes.internal_server_error, constants.response_codes.error, constants.response_codes.unauthorized].includes(response.statusCode)) { return next(true); } return next(null, { statuscode: response.statusCode, data: response.body }); }); });
额外注意点
- 如果需要处理多个文件,把
upload.single('file')换成upload.array('files', 5)(最多5个文件),然后在formData里循环添加每个文件即可。 - Laravel那边接收文件的方式和普通上传一致,比如用
$request->file('file')获取文件对象,再调用store()方法存储。 - 小提醒:
request库目前已经处于维护状态,后续如果考虑升级,可以换成axios或者node-fetch,它们处理multipart请求的体验也很好。
内容的提问来源于stack exchange,提问作者Shaju Nr
相关产品推荐
相关产品推荐

