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

Flask接收文件后转发至其他API遇400错误的技术咨询

解决Flask中转发上传文件的400错误问题

我看你现在卡在了Flask接收文件后转发到另一个接口的环节,返回400错误其实是因为请求头的设置出了问题,咱们一步步来解决:

问题根源

你手动设置了headers={'Content-type': 'multipart/form-data'},但multipart/form-data请求需要自带**边界标识(boundary)**才能让后端正确解析文件。而requests库在你传入files参数时,会自动生成包含边界的正确请求头,你手动指定的头反而覆盖了这个自动生成的正确配置,导致目标接口无法解析请求,返回400。

修改后的代码

把请求部分的代码改成这样就可以了:

@app.route('/file', methods=['POST'])
def get_task_file():
    response_obj = {}
    if 'file' not in request.files:
        abort(400)
    
    file_obj = request.files["file"]
    print(file_obj.filename)
    
    # 转发请求到目标接口
    url1 = 'http://localhost:5001/text/api'
    # 关键:不要手动设置Content-type头,让requests自动处理
    # 把FileStorage对象拆成元组传递,保留文件名、数据流和Content-Type
    r1 = requests.post(url1, files={'file': (file_obj.filename, file_obj.stream, file_obj.content_type)})
    print(r1.text)
    
    return response_obj

为什么要这么写?

  • werkzeug.datastructures.FileStorage对象本质上是一个带元数据的文件流,把它拆成(filename, stream, content_type)的元组传给requests,能保证文件的完整信息被正确传递。
  • 去掉手动设置的Content-type头后,requests会自动生成包含边界的multipart/form-data头,目标接口就能正常解析文件了。

关于第二个API的疑问

如果第二个接口也是用Flask实现的,并且逻辑和你现在的接收接口类似(用request.files.get('file')获取文件),那完全不需要修改。只要你这边转发的请求格式正确,它就能正常接收并处理文件。

额外注意点

  • 如果上传的文件比较大,记得在Flask配置里设置MAX_CONTENT_LENGTH,比如app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024(限制16MB),避免上传时被拦截。
  • 如果需要同时转发其他表单字段,可以在requests.post里加上data参数,比如data={'key': 'value'},requests会自动把files和data合并成合法的multipart/form-data请求。

内容的提问来源于stack exchange,提问作者Artur Haczek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:03:29