如何使用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
相关产品推荐
相关产品推荐

