如何将Web应用拖拽上传的文件作为入参传递给Python代码
PDF上传提取Web应用实现方案
Flask对该需求的适配性
Flask会大幅简化这个需求的开发流程,完全适合你的场景:
- 它原生支持解析
multipart/form-data格式的文件上传请求,不需要额外引入复杂的依赖处理上传报文 - 你已经写好的本地PDF提取代码几乎不需要改动,只要对接上Flask拿到的文件对象即可
- 部署门槛低,不管是个人工具还是面向少量用户的服务都能支撑,后续扩展功能也方便
具体实现逻辑
核心思路是通过Flask的请求对象拿到用户上传的文件流,直接传入你已有的提取逻辑,不需要做复杂的格式转换:
- 第一步:基础配置。设置允许的文件后缀为仅PDF,限制单文件大小避免超大文件占满服务器资源,配置临时文件规则(如果需要落盘的话)。
- 第二步:编写上传入口。前端表单必须添加
enctype="multipart/form-data"属性,否则浏览器不会把文件内容编码到请求里。 - 第三步:后端接收文件。在处理POST请求的接口中,通过
request.files获取上传的文件对象,这个对象和你本地打开的文件对象行为一致,支持直接读二进制流、保存到本地两种操作。 - 第四步:对接你的提取代码。如果你现有的提取函数接收本地文件路径作为参数,就把上传的文件存到临时目录,把临时路径传给提取函数,处理完自动删除临时文件即可;如果你用的PDF解析库(比如pdfplumber、PyPDF2)支持直接读取二进制流,甚至不需要落盘,直接读取文件流传入提取函数就行,效率更高。
最小可运行代码示例
from flask import Flask, request, jsonify import tempfile # 导入你已经写好的PDF提取函数即可,例: # from your_existing_code import extract_target_data_from_pdf app = Flask(__name__) # 基础配置 app.config["ALLOWED_EXTENSIONS"] = {"pdf"} app.config["MAX_CONTENT_LENGTH"] = 16 * 1024 * 1024 # 单文件最大16MB,可按需调整 def check_file_valid(filename): return "." in filename and filename.rsplit(".", 1)[1].lower() in app.config["ALLOWED_EXTENSIONS"] # 上传页面 @app.route("/", methods=["GET"]) def upload_page(): return """ <!doctype html> <title>PDF数据提取工具</title> <h1>上传PDF提取指定数据</h1> <form method="POST" enctype="multipart/form-data"> <input type="file" name="pdf" accept=".pdf" required> <button type="submit">开始提取</button> </form> """ # 上传处理接口 @app.route("/", methods=["POST"]) def process_pdf(): # 校验请求合法性 if "pdf" not in request.files: return jsonify({"code": 400, "msg": "请求中未包含PDF文件"}), 400 upload_file = request.files["pdf"] if upload_file.filename == "": return jsonify({"code": 400, "msg": "未选择待上传的文件"}), 400 if not check_file_valid(upload_file.filename): return jsonify({"code": 400, "msg": "仅支持上传PDF格式文件"}), 400 # 对接已有提取逻辑 # 方案1:你的函数需要本地路径参数时,用临时文件存储,处理完自动删除 with tempfile.NamedTemporaryFile(suffix=".pdf", delete=True) as tmp_file: upload_file.save(tmp_file.name) # 直接调用你已有的提取函数 # result = extract_target_data_from_pdf(tmp_file.name) result = {"demo": "此处替换为你的提取函数返回结果"} # 方案2:你的函数支持字节流输入时,不需要落盘,直接读取内容传入 # file_content = upload_file.read() # result = extract_target_data_from_bytes(file_content) return jsonify({"code": 200, "msg": "提取完成", "data": result}) if __name__ == "__main__": # 仅开发调试用,生产环境替换为Gunicorn/Waitress等WSGI服务 app.run(host="0.0.0.0", port=5000, debug=False)
部署注意事项
- 生产环境不要直接用Flask自带的开发服务器,Linux环境用Gunicorn、Windows环境用Waitress作为WSGI服务承载应用,前面可以套Nginx做反向代理提升稳定性。
- 如果单份PDF提取耗时超过10秒,建议加Celery做异步任务处理,避免HTTP请求超时;如果单份文件处理很快,同步处理完全够用,不需要额外引入消息队列增加复杂度。
- 不需要留存用户上传文件的话,优先用字节流或者自动删除的临时文件方案,定期清理残留文件避免占满服务器磁盘。
- 除了后缀校验,建议加PDF文件头校验,防止用户将恶意文件改后缀上传带来安全风险。
内容的提问来源于stack exchange,提问作者Mihir Sanjay
相关产品推荐
相关产品推荐

