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
相关产品推荐
相关产品推荐

