Node.js使用Request发送二进制数据上传WordPress图片异常问题
解决Node.js Request库上传WordPress REST API图片异常的问题
我之前踩过完全一样的坑!你看到的17字节的@hh.jpg文件,说明你的Node.js代码根本没把图片的二进制数据传上去,反而把@hh.jpg这个字符串当成了文件内容发送给WordPress了——这和Curl的行为不一样,Curl会自动识别@前缀来读取本地文件,但Request库不吃这一套。
问题根源
Curl的-F "file=@hh.jpg"语法会自动解析@后面的路径,读取文件的二进制流并上传;但在Node.js的Request库中,如果你直接在formData里写file: '@hh.jpg',它只会把这个字符串作为表单字段的值发送,WordPress收到后就把这个字符串保存成了文件,所以才会出现17字节的异常文件。
正确的实现方式
你需要用Node.js的fs模块读取文件的流(或Buffer),并在formData中显式配置文件信息。下面是修正后的代码:
const request = require('request'); const fs = require('fs'); // 配置请求参数 const uploadOptions = { url: 'https://你的WordPress站点域名/wp-json/wp/v2/media', headers: { // 替换成你的授权令牌(需要有上传媒体的权限) 'Authorization': 'Bearer YOUR_JWT_TOKEN', // 可选,但建议指定正确的MIME类型 'Content-Type': 'image/jpeg' }, formData: { file: { // 用fs.createReadStream读取本地文件流(大文件推荐用流) value: fs.createReadStream('./hh.jpg'), options: { filename: 'hh.jpg', // 上传到WordPress后的文件名 contentType: 'image/jpeg' // 对应文件的MIME类型 } } } }; // 发送POST请求 request.post(uploadOptions, (error, response, body) => { if (error) { console.error('上传失败:', error); return; } // 解析并打印WordPress返回的响应 console.log('上传成功:', JSON.parse(body)); });
额外注意事项
- 如果你的图片是PNG格式,记得把
contentType改成image/png; - 确保你的JWT令牌或Basic Auth凭证拥有
upload_files权限; - 如果是小文件,也可以用
fs.readFileSync('./hh.jpg')获取Buffer来代替流,但大文件用流更节省内存; - 检查文件路径是否正确,避免因路径错误导致读取不到文件,最终还是传空内容。
这样修改后,WordPress就能正确接收图片的二进制数据,生成正常的图片文件了。
内容的提问来源于stack exchange,提问作者Atul Sharma
相关产品推荐
相关产品推荐

