问题背景
在使用Node.js的got库向Python Flask后端发送文件上传请求时,可能会遇到request.files为空,但文件数据却出现在request.form中的情况。本文将分析问题的原因,并提供正确的解决方案。
原因分析
1.未正确设置filename
当使用FormData.append()上传Buffer或二进制数据时,如果没有指定filename,Flask可能无法正确识别文件数据,导致数据被解析为普通表单字段(request.form)。
示例错误代码:
formData.append('file', bufferData, { contentType: 'audio/mpeg' }); // 缺少filename
2. Content-Type被错误覆盖
got库在发送FormData时会自动设置multipart/form-data,但如果手动指定Content-Type,可能会破坏请求的boundary,导致Flask解析失败。
3.Flask接收方式错误
如果后端未正确使用request.files,或者文件字段名称不匹配,也会导致数据被存入request.form。
解决方案
1.确保FormData.append()包含filename
formData.append('file', bufferData, {
contentType: 'audio/mpeg',
filename: 'audio.mp3' // 关键:必须提供文件名
});
2.避免手动设置Content-Type
got会自动处理,无需额外设置:
const response = await got.post(url, { body: formData });
3.检查Flask接收代码
确保使用request.files获取文件:
file = request.files['file'] # 字段名需匹配前端
总结
Flask接收不到request.files通常是由于前端未正确设置filename或请求头问题。通过规范FormData的构造和确保后端正确解析,即可解决该问题。