NodeJS后端调用Python文件上传API报错:Expected UploadFile, received <class 'str'>
NodeJS后端转发Base64图片至Python API失败求助
应用架构
- 前端:React Admin框架接收文件,将图片编码为Base64格式后发送至后端API
- 后端:基于NestJS开发,接收前端传来的Base64图片
- 核心问题:后端需要将图片转发至外部Python API完成上传,但多次尝试均失败
已尝试的方案及错误结果
方案1:将Base64转为Buffer后直接发送
import axios from 'axios'; import FormData from 'form-data'; export async function upload( fileBase64: string, filename: string ): Promise<any> { const buffer = Buffer.from(fileBase64, 'base64') const extension = fileBase64.substring(fileBase64.indexOf('/') + 1, fileBase64.indexOf(";;base64")) const cleanBase64 = fileBase64.replace(/^data:image\/png;base64,/, '') const cleanImageBuffer = Buffer.from(cleanBase64, 'base64') const formData = new FormData(); // 也尝试过传入cleanImageBuffer,结果一致 formData.append('file', buffer); formData.append('fileName', filename + '.' + extension); formData.append('namespace', 'test'); return await axios .post('external_api_url', JSON.stringify(formData), { headers: { Authorization: `Bearer token`, ContentType: 'multipart/form-data' } }) .then((response) => { console.log('response = ' + JSON.stringify(response)) })
错误结果:
{ "status": "error", "error": { "code": "bad_request", "message": "file Expected UploadFile, received: <class 'str'>" } }
方案2:保存Base64到本地磁盘,通过文件流发送
import fs from 'fs'; import axios from 'axios'; import FormData from 'form-data'; export async function upload ( fileBase64: string, filename: string ): Promise<any> { const extension = fileBase64.substring(fileBase64.indexOf('/') + 1, fileBase64.indexOf(";;base64")) const cleanBase64 = fileBase64.replace(/^data:image\/png;base64,/, '') const TMP_UPLOAD_PATH = '/tmp' if (!fs.existsSync(TMP_UPLOAD_PATH)) { fs.mkdirSync(TMP_UPLOAD_PATH); } fs.writeFile(TMP_UPLOAD_PATH + '/' + filename + '.' + extension, cleanBase64, 'base64', function(err) { console.log(err); }) const fileStream = fs.createReadStream(TMP_UPLOAD_PATH + '/' + filename + '.' + extension) const formData = new FormData(); formData.append('file', fileStream, filename + '.' + extension); formData.append('fileName', filename + '.' + extension); formData.append('namespace', 'test'); return await axios .post('external_api_url', formData, { headers: { Authorization: `Bearer token`, ContentType: 'multipart/form-data' } }) .then((response) => { console.log('response = ' + JSON.stringify(response)) }) }
错误结果:
{ "status": "error", "error": { "code": "bad_request", "message": "file Expected UploadFile, received: <class 'str'>" } }
其他尝试
- 使用node-fetch的fetch方法发送,得到相同错误
- 升级axios至最新版本1.1.3,问题依旧
期望的最优方案
无需将Base64图片保存到本地磁盘,直接转为Buffer后发送至外部Python API
可用的Python示例代码(验证过可正常运行)
import requests url = "http://127.0.0.1:8000/external_api" payload={'namespace': 'test'} files=[ ('file',('lbl-pic.png',open('/local/path/lbl-pic.png','rb'),'image/png')) ] headers = { 'Authorization': 'Bearer token' } response = requests.request("POST", url, headers=headers, data=payload, files=files) print(response.text)
内容的提问来源于stack exchange,提问作者aaa
相关产品推荐
相关产品推荐

