You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flask(Python)单API中解析文件与JSON请求

同时接收文件与字符串参数的Flask-RESTPlus API问题解决

问题根源

当通过multipart/form-data上传文件时,请求的Content-Type并非application/json,因此Flask不会将请求体解析为JSON对象,request.json自然为空。同时你原代码存在DTO定义混乱(变量未定义、字段名不匹配)的问题,进一步导致参数解析失败。

正确解决方案(推荐)

文件上传请求默认使用multipart/form-data格式,应将字符串参数作为表单字段一同传递,用reqparse统一解析文件与表单参数,无需分开操作request.files和request.json。

1. 修正DTO定义

from flask_restplus import reqparse, Namespace
from werkzeug.datastructures import FileStorage

api = Namespace('user', description='user operations')

class FilesUploadDto:
    # 创建统一的解析器,同时处理文件和表单参数
    upload_parser = reqparse.RequestParser()
    # 添加文件参数
    upload_parser.add_argument('myfile1', location='files', type=FileStorage, required=True, help='First file')
    upload_parser.add_argument('myfile2', location='files', type=FileStorage, required=True, help='Second file')
    # 添加字符串参数(默认location为form,可省略)
    upload_parser.add_argument('username', type=str, required=True, help='Username')

注:修复了原代码中file_upload未定义、变量重复赋值、字段名不匹配的问题。

2. 修正控制器代码

from flask_restplus import Resource
from your_dto_module import FilesUploadDto, api

@api.route('/my_file_upload')
class UploadMyFile(Resource):
    @api.doc("Upload my file")
    @api.expect(FilesUploadDto.upload_parser, validate=True)
    def post(self):
        # 一次性解析所有参数
        args = FilesUploadDto.upload_parser.parse_args()
        user_name = args['username']
        my_file1 = args['myfile1']
        my_file2 = args['myfile2']
        return some_function(user_name, my_file1, my_file2)

通过parse_args()统一获取文件与字符串参数,自动完成校验,无需直接操作request对象的属性。

补充说明

  • request.files仅存储上传的文件对象,字符串表单参数需从request.form获取,但使用reqparse统一解析更符合RESTPlus的规范,也能自动处理参数校验与错误提示。
  • 在Swagger UI测试时,直接在参数表单中填写username值并选择文件即可,Swagger会自动以multipart/form-data格式发送请求,匹配解析逻辑。

内容的提问来源于stack exchange,提问作者Shaikh Shoeb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:50:20