我想上传一个图像文件和一些文本到我的API端点,我有一个Flask API服务器来处理来自React Native APP和单元测试脚本的post请求,但我不知道为什么我只能获取数据来自 request.form 而不是 request.files,request.files 是
ImmutableMultiDict([])
,request.form 是 ImmutableMultiDict([('image', "<FileStorage: 'test.jpg' ('image/jpeg')>")])
,其值表示为 str 而不是 FileStorage 对象。这是我的代码:
单元测试.py
import io
import unittest
from api import app
class FlaskAppTests(unittest.TestCase):
def setUp(self):
self.app = app.test_client()
self.app.testing = True
with open('image/test.jpg', 'rb') as img:
self.binary_image = img.read()
def test_facial_authentication_response(self):
response = self.app.post('/facial_authentication', content_type='multipart/form-data', data={
'image': (self.binary_image, 'test.jpg', 'image/jpeg')
})
self.assertEqual(response.status_code, 200)
self.assertEqual(response.content_type, 'application/json')
if __name__ == '__main__':
unittest.main()
React Native 代码:
await fetch('http://api-end-point', {
method: 'POST',
headers: {'Content-Type': 'multipart/form-data'},
body: formData,
}).then(res => res.json()).then(json => {
console.log(json);
}).catch((error) => {
console.error(error);
});
};
Flask app.py:
import io
from flask import Flask, request
app = Flask(__name__)
CORS(app)
@app.route('/', methods=['POST'])
def api():
image_from_form = request.form['image'] # error raised cause the dict is empty
image_from_files = request.files['image'] # return "<FileStorage: 'test.jpg' ('image/jpeg')>"
print(image_from_form, " and ", image_from_files)
# ImmutableMultiDict([]) and ImmutableMultiDict([('image', "<FileStorage: 'test.jpg' ('image/jpeg')>")])
with open(os.path.join(dirname, 'temp.jpg'), "wb") as file:
file.write(binary_image)
图像本身是二进制/Blob对象,取决于客户端,我必须将其解码回JPG图像。我试图从 anwser 中询问 ChatGPT 或 google,但几乎结果只是提到如果内容类型和文件字段正确,则 request.files 应该包含文件。
在您提到的代码的注释中,
image_from_form = request.form['image'] # error raised cause the dict is empty
image_from_files = request.files['image'] # return "<FileStorage: 'test.jpg' ('image/jpeg')>"
request.files['image'] 包含图像。您可以使用代码保存它 -
image_from_files = request.files['image']
image_from_files.save('test.jpg')
如果 request.form 是 ImmutableMultiDict([('image', "
request.form['image'].save('test.jpg')