問題背景
在使用Node.js的got庫向Python Flask后端發(fā)送文件上傳請求時,可能會遇到request.files為空,但文件數(shù)據(jù)卻出現(xiàn)在request.form中的情況。本文將分析問題的原因,并提供正確的解決方案。
原因分析
1.未正確設(shè)置filename
當(dāng)使用FormData.append()上傳Buffer或二進制數(shù)據(jù)時,如果沒有指定filename,F(xiàn)lask可能無法正確識別文件數(shù)據(jù),導(dǎo)致數(shù)據(jù)被解析為普通表單字段(request.form)。
示例錯誤代碼:
formData.append('file', bufferData, { contentType: 'audio/mpeg' }); // 缺少filename
2. Content-Type被錯誤覆蓋
got庫在發(fā)送FormData時會自動設(shè)置multipart/form-data,但如果手動指定Content-Type,可能會破壞請求的boundary,導(dǎo)致Flask解析失敗。
3.Flask接收方式錯誤
如果后端未正確使用request.files,或者文件字段名稱不匹配,也會導(dǎo)致數(shù)據(jù)被存入request.form。
解決方案
1.確保FormData.append()包含filename
formData.append('file', bufferData, {
contentType: 'audio/mpeg',
filename: 'audio.mp3' // 關(guān)鍵:必須提供文件名
});
2.避免手動設(shè)置Content-Type
got會自動處理,無需額外設(shè)置:
const response = await got.post(url, { body: formData });
3.檢查Flask接收代碼
確保使用request.files獲取文件:
file = request.files['file'] # 字段名需匹配前端
總結(jié)
Flask接收不到request.files通常是由于前端未正確設(shè)置filename或請求頭問題。通過規(guī)范FormData的構(gòu)造和確保后端正確解析,即可解決該問題。