如何使用Node.js的request库发送文件?解决文件上传ERR_STREAM_WRITE_AFTER_END错误
问题原因
- 你的
curl请求是直接将ZIP文件二进制内容作为请求体传输,并非multipart/form-data表单上传,代码中同时配置body和formData两个参数产生冲突,导致请求流关闭后还尝试写入表单数据,抛出write after end错误。 @文件路径是curl专属语法,Node.js的request库不会识别该语法自动读取本地文件,你将该字符串赋值给body的写法是无效的。
修复后的代码
const fs = require('fs'); const request = require('request'); const zipPath = '/Users/aitplap24/Desktop/WebGIS/uploads/users/61adbbe3ececf2068d6eb862/1638776276622.zip'; var options = { url: 'http://localhost:8080/geoserver/rest/workspaces/61adbbe3ececf2068d6eb862/datastores/test1/file.shp', method: 'PUT', headers: { 'Content-type': 'application/zip' }, // 直接传入文件读取流作为请求体,和curl --data-binary效果一致 body: fs.createReadStream(zipPath), auth: { 'user': 'admin', 'pass': 'geoserver' } }; request(options, (error, response, body) => { console.log(error, response, body); });
补充说明
如果文件体积较小,也可以用fs.readFileSync(zipPath)读取为Buffer传入body参数,效果一致。另外request库已经停止维护,生产环境建议替换为axios、node-fetch等仍在迭代的HTTP请求库。
内容的提问来源于stack exchange,提问作者Piyush
相关产品推荐
相关产品推荐

