如何在Python中获取表单文件选择框选中文件的绝对路径?
解决Flask中无法获取上传文件本地绝对路径的问题
首先得明确一个核心误解:浏览器在处理文件上传时,绝不会把用户本地文件的真实绝对路径发送给服务器。你拿到的document.filename只是用户本地的文件名(部分浏览器甚至会刻意隐藏真实路径,只返回纯文件名),所以用os.path.abspath(orig_filename)得到的自然是服务器当前工作目录拼接文件名的路径——这本来就不是用户本地的真实路径,而且从安全和隐私角度,服务器也不应该获取到用户本地的文件路径。
那正确的处理方式是什么?你需要先把上传的文件保存到服务器的指定目录,然后获取这个文件在服务器上的绝对路径。针对你的Python 2.7 + Flask 0.12环境,修改后的代码如下:
import os from flask import Flask, request app = Flask(__name__) # 定义服务器上的文件保存目录,提前创建好并确保有读写权限 UPLOAD_FOLDER = '/opt/flask_uploads' app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER def get_hash_for_doc(file_path): # 你的哈希计算逻辑,这里接收服务器上的文件路径即可 pass @app.route('/upload', methods=['POST']) def upload_file(): for attr, document in request.files.iteritems(): orig_filename = document.filename if not orig_filename: continue # 跳过空文件 # 拼接服务器端的完整保存路径 server_file_path = os.path.join(app.config['UPLOAD_FOLDER'], orig_filename) # 将上传的文件保存到服务器 document.save(server_file_path) # 获取该文件在服务器上的绝对路径 absolute_path = os.path.abspath(server_file_path) print(absolute_path) # 传入服务器文件路径计算哈希 mhash = get_hash_for_doc(absolute_path) return 'Upload processed successfully'
额外注意事项:
- 确保
UPLOAD_FOLDER目录在Linux系统中存在,并且运行Flask进程的用户拥有该目录的读写权限(可以用mkdir -p /opt/flask_uploads创建,chown www-data:www-data /opt/flask_uploads调整权限,具体用户根据你的部署环境调整)。 - 如果担心文件名重复导致覆盖,可以给文件名添加唯一标识(比如时间戳、UUID),比如:
orig_filename = f"{uuid.uuid4().hex}_{document.filename}"。 - 如果你的哈希计算逻辑不需要完整文件路径,也可以直接读取文件内容进行计算,不用保存到磁盘,比如
document.read()获取文件字节流后传入哈希函数。
内容的提问来源于stack exchange,提问作者user956424
相关产品推荐
相关产品推荐

