为什么HTTP请求将图像文件放入request.form而不是request.files?

问题描述 投票:0回答:1

我想上传一个图像文件和一些文本到我的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 应该包含文件。

python flask request binaryfiles
1个回答
0
投票

在您提到的代码的注释中,

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')
© www.soinside.com 2019 - 2024. All rights reserved.