Tornado框架如何获取POST请求multipart/form-data格式上传的附件
Tornado multipart/form-data 文件上传获取失败解决方案
问题原因
RequestHandler.get_argument、RequestHandler.get_body_argument 仅支持获取表单中的普通文本字段,无法读取上传的二进制文件内容。Tornado 会将所有 multipart/form-data 格式请求中的上传文件,独立存储在 self.request.files 属性中,不会和普通参数混合解析。
正确实现代码
from tornado.web import RequestHandler class CustomHandler(RequestHandler): def post(self): # 普通参数获取方式不变,和之前写法一致 dic = {} dic['operation'] = self.get_argument("operation") # 获取上传文件,替换为你Postman中文件字段对应的key值 # 示例假设Postman里文件字段的key为"upload_file" uploaded_files = self.request.files.get("upload_file", []) if not uploaded_files: self.write({"code": 1, "msg": "未检测到上传文件"}) return # 单个字段上传多文件时会返回多个元素,取第一个文件为例 target_file = uploaded_files[0] # 获取文件信息 file_name = target_file["filename"] # 原始文件名 file_binary = target_file["body"] # 文件二进制内容,可直接写入本地存储 file_mime = target_file["content_type"] # 文件的MIME类型 # 后续业务逻辑,比如保存文件 with open(f"./save_path/{file_name}", "wb") as f: f.write(file_binary) self.write({"code": 0, "msg": f"文件{file_name}上传成功"})
常见问题排查
- 确认Postman中文件字段的key名称和代码中
self.request.files.get()的入参完全一致,避免拼写错误、多余空格 - 确认请求头
Content-Type确实为multipart/form-data,Postman选form-data格式时会自动携带该请求头,不需要手动设置 - 若使用反向代理服务(如Nginx),确认代理配置未限制上传文件大小、未篡改multipart格式的请求体
- 确认Tornado版本≥4.0,旧版本Tornado对multipart请求的解析逻辑存在兼容性问题
内容的提问来源于stack exchange,提问作者kittu
相关产品推荐
相关产品推荐

