如何在HTML表单中传入JSON文件并以表格展示内容(Python Flask)
解决Flask读取上传JSON文件失败的问题
问题根源
- 文件指针偏移:调用
jf.save()后,文件对象的指针会移动到文件末尾,此时再执行json.load(jf)会因无内容可读报错。 - 路由冲突:两个
@app.route('/')定义会导致Flask仅识别最后一个路由,原index路由会被覆盖。 - 上传路径无效:
app.config["FILE_UPLOAD"]设为空字符串,保存文件时可能出现路径错误,需指定有效目录。
修正后的代码
from flask import Flask, render_template, request, jsonify import os import json app = Flask(__name__) # 设置上传目录,自动创建不存在的目录 app.config["FILE_UPLOAD"] = "uploads" os.makedirs(app.config["FILE_UPLOAD"], exist_ok=True) @app.route('/', methods=['GET', 'POST']) def handle_request(): if request.method == 'GET': return render_template("form.html") elif request.method == 'POST': jf = request.files["file"] # 方案1:先读取内容,重置指针后保存 jdata = json.load(jf) jf.seek(0) # 将文件指针重置到开头 jf.save(os.path.join(app.config["FILE_UPLOAD"], jf.filename)) # 方案2:先保存文件,再重新打开读取(更适合大文件) # save_path = os.path.join(app.config["FILE_UPLOAD"], jf.filename) # jf.save(save_path) # with open(save_path, 'r') as f: # jdata = json.load(f) print("file uploaded") return jsonify(jdata) if __name__ == "__main__": app.run(debug=True)
关键修改说明
- 合并路由:将GET(渲染表单)和POST(处理上传)逻辑合并到同一个路由,避免冲突。
- 调整读写顺序:
- 方案1先读取JSON内容,再重置指针保存文件,适合小文件场景。
- 方案2先保存文件到本地,再重新打开读取,稳定性更高,适配大文件。
- 确保目录存在:用
os.makedirs(..., exist_ok=True)自动创建上传目录,避免路径不存在的异常。
内容的提问来源于stack exchange,提问作者Arshdeep Singh Bhatia
相关产品推荐
相关产品推荐

