Flask文件上传遇Bad Request 400及500错误,求解决方法
问题分析与解决
核心错误点
- 请求参数不匹配:测试脚本中上传文件的键是
"log.txt",但服务器端期望的键是"file",导致无法获取上传文件 - 文件名判断逻辑错误:
isFileAllowed函数直接传入文件对象而非文件名,无法正确判断后缀 - secure_filename参数错误:传入了文件对象而非文件名字符串,触发类型错误
- 潜在问题:未确保上传目录存在,可能导致文件保存失败
修正后的服务器代码
import flask, os, werkzeug.utils UPLOAD_FOLDER = "files/" ALLOWED_EXTENSIONS = {"txt"} # 确保上传目录存在,避免保存文件时出错 os.makedirs(UPLOAD_FOLDER, exist_ok=True) def isFileAllowed(filename): # 接收文件名,判断后缀是否合法 return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS app = flask.Flask(__name__) app.config["UPLOAD_DIR"] = UPLOAD_FOLDER @app.route("/log_receiver", methods = ["POST", "GET"]) def log_receiver(): if flask.request.method == "POST": # 获取上传的文件对象,键名和测试脚本保持一致 file = flask.request.files.get("file") if file and file.filename and isFileAllowed(file.filename): # 传入文件名给secure_filename处理 filename = werkzeug.utils.secure_filename(file.filename) file.save(os.path.join(app.config["UPLOAD_DIR"], filename)) return "Successfully uploaded" return "File couldn't be uploaded" # GET请求返回合理提示,避免返回易误解的404 return "Use POST method to upload files" if __name__ == '__main__': app.run(debug=True)
修正后的测试脚本代码
import requests def log_uploader(): with open("log.txt", "rb") as log: # 上传文件的键名改为"file",和服务器端对应;元组格式指定原始文件名 r = requests.post("http://localhost:5000/log_receiver", files={"file": ("log.txt", log)}) print(r.text) if __name__ == '__main__': log_uploader()
关键修正说明
- 参数键名统一:服务器用
request.files["file"]获取文件,测试脚本的files字典键名必须对应为"file",同时通过元组指定原始文件名,确保服务器能正确获取文件名 - 修复后缀判断函数:
isFileAllowed改为接收文件名字符串,而非文件对象,正确提取后缀进行合法性校验 - 修正secure_filename参数:传入
file.filename(文件对象的文件名属性)而非文件对象本身,符合函数参数要求 - 创建上传目录:添加
os.makedirs(UPLOAD_FOLDER, exist_ok=True),提前确保目录存在,避免保存文件时抛出异常 - 优化GET请求返回:将GET请求的返回从"404, not found"改为明确提示,避免误解路由不存在
内容的提问来源于stack exchange,提问作者Daymons
相关产品推荐
相关产品推荐

