使用cURL向Express服务器POST图片无法接收文件如何解决
问题原因
你无法接收上传文件有两个核心问题:
- Express 框架本身不内置文件上传解析能力,
req.file是第三方文件上传中间件才会挂载的属性,你的代码里没有引入任何文件解析逻辑,自然输出undefined - 你用的cURL命令参数错误:
-T(--upload-file)参数默认发送PUT请求、直接把文件二进制流放到请求体传输,就算强制指定-X POST,也不会封装成服务端能识别的表单上传格式。
解决步骤
1. 安装文件上传中间件
Node生态里最常用的Express文件上传中间件是multer,在项目目录执行命令安装:
npm install multer
2. 修改服务端代码
引入multer,配置上传文件存储路径,在对应路由上挂载单文件解析中间件,注意中间件里指定的表单字段名要和后续上传请求的字段名一致:
var express = require('express'); var multer = require('multer'); // 配置上传文件保存到当前目录下的uploads文件夹,使用前请手动创建该文件夹 var upload = multer({ dest: 'uploads/' }) var app = express(); app.listen(6692, () => { console.log(`Success! Your application is running on port 6692.`); }); // upload.single('image') 表示接收字段名为image的单个上传文件 app.post('/upload', upload.single('image'), function (req, res) { console.log(req.file) // 此处即可打印出上传文件的完整信息 res.send('File uploaded!'); });
3. 修正cURL上传命令
不要用-T参数,改用-F(--form)参数提交multipart格式表单,@符号后接本地文件路径,字段名和服务端配置的image保持一致:
curl -F "image=@Untitled.png" localhost:6692/upload
执行后服务端就能正常收到上传的图片,文件会自动存到你配置的uploads目录下。
如果你确实要使用
-T参数直接传原始二进制流,不需要引入multer,需要自己监听请求的data、end事件拼接二进制 Buffer,再手动写入本地文件,这种方案适合大文件流式传输场景,普通表单上传用上面的multer方案即可。
内容的提问来源于stack exchange,提问作者AnotherPillow
相关产品推荐
相关产品推荐

