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

如何使用Flask通过URL传递本地文件路径实现文件上传至web服务器

Flask 通过URL传递文件路径实现文件处理的实现方案

首先明确适用边界:

  • 以下方案仅适用于路径指向 Flask服务端本地存储的文件,如果是访问用户(客户端)的本地文件路径,出于浏览器安全沙箱限制,无法直接通过URL参数读取客户端本地文件,仍需要客户端通过表单手动选择文件上传。

具体实现步骤

1. 核心路由编写

你可以选择两种传参方式接收文件路径:作为URL查询参数传递,或者作为路径变量传递,完整示例代码如下:

from flask import Flask, request
import os

app = Flask(__name__)
# 配置允许读取的文件目录白名单,必须配置,避免任意文件读取漏洞
ALLOWED_READ_DIRS = ["/path/to/your/allowed/upload_dir", "/path/to/other/allowed_dir"]

def check_path_safety(file_path):
    # 校验路径合法性,防止路径穿越攻击
    abs_file_path = os.path.abspath(file_path)
    abs_allowed_dirs = [os.path.abspath(dir_path) for dir_path in ALLOWED_READ_DIRS]
    for allowed_dir in abs_allowed_dirs:
        if abs_file_path.startswith(allowed_dir):
            return True
    return False

# 方式1:路径作为查询参数,访问示例:http://127.0.0.1:5000/handle_file?file_path=/test/1.txt
@app.route("/handle_file")
def handle_file_with_query():
    file_path = request.args.get("file_path")
    # 基础参数校验
    if not file_path:
        return "缺少必填参数file_path", 400
    if not check_path_safety(file_path):
        return "无权限访问该路径文件", 403
    if not os.path.isfile(file_path):
        return "目标路径不是有效文件", 404
    # 此处替换为你原本表单上传后的文件处理逻辑即可
    with open(file_path, "r", encoding="utf-8") as f:
        file_content = f.read()
    return f"文件处理完成,文件大小:{len(file_content)} 字节"

# 方式2:路径作为路径变量,访问示例:http://127.0.0.1:5000/handle_file//test/1.txt
@app.route("/handle_file/<path:file_path>")
def handle_file_with_pathvar(file_path):
    # 校验逻辑和处理逻辑和上述完全一致
    if not check_path_safety(file_path):
        return "无权限访问该路径文件", 403
    if not os.path.isfile(file_path):
        return "目标路径不是有效文件", 404
    # 替换为你的文件处理逻辑
    return "文件处理完成"

if __name__ == "__main__":
    app.run(debug=True)

2. 安全注意事项

  • 必须配置允许访问的目录白名单,禁止接口读取任意路径文件,否则会出现任意文件读取漏洞,攻击者可通过传入/etc/passwd等系统路径读取服务器敏感信息
  • 如果需要处理客户端本地文件,必须保留原有的表单上传逻辑,无法通过直接传客户端本地路径实现自动上传

内容的提问来源于stack exchange,提问作者Indrajeet Datta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:45:10