You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:36:18