Ubuntu下基于Flask开发文件上传时出现PermissionError权限被拒绝报错
问题核心原因
你现在遇到的权限报错,和你之前给单个UploadFile.xlsx文件赋读、写、执行权限的操作没有关系:
- 你的代码默认会把上传的文件直接写入Flask进程启动时的当前工作目录,报错本质是这个工作目录对运行Flask进程的用户(也就是你提到的UID33,绝大多数场景下这个UID对应Ubuntu内置的www-data服务用户)没有新建文件的写权限
- 你给已存在的单个xlsx文件赋权限,只能控制这个已有文件的读写,没法解决在目录里新建上传文件时的权限校验问题,自然会一直报Permission denied
- 额外的代码缺陷:没有显式指定上传文件的存储路径,用相对路径保存文件的基准路径完全由Flask启动时的工作目录决定,很多时候会指向系统受限的目录(比如用systemd托管服务时,默认工作目录可能是/,普通服务用户根本没有写权限)
实操解决步骤
- 第一步:创建独立的上传存储目录
不要把上传文件直接存在项目根目录,先在终端创建专门的存储文件夹,比如:mkdir -p /你的项目实际绝对路径/uploads
一定要写绝对路径,不要用相对路径,避免路径基准混乱。 - 第二步:给正确的主体配置目录权限
先确认运行Flask进程的用户是不是UID33:执行id 33,如果返回的用户是www-data,就直接给这个目录授权给该用户:
这里要注意:权限是要给目录的,不是给某个提前放好的测试文件的,只有目录有写权限,才能在目录里新建上传的文件。chown -R 33:33 /你的项目实际绝对路径/uploads chmod 755 /你的项目实际绝对路径/uploads - 第三步:修正代码里的保存逻辑
把原来直接保存到当前工作目录的代码,改成拼接独立上传目录的完整绝对路径,避免路径指向错误:
调整后的Python代码参考:
原有的HTML上传表单逻辑没有问题,不需要调整。import os from flask import Flask, request from werkzeug.utils import secure_filename app = Flask(__name__) # 配置独立的上传目录绝对路径 UPLOAD_FOLDER = '/你的项目实际绝对路径/uploads' app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER @app.route('/upload') def upload_file(): return render_template('upload.html') @app.route('/uploader', methods=['GET', 'POST']) def upload(): if request.method == 'POST': f = request.files['file'] # 拼接完整保存路径,不再默认写入当前工作目录 save_full_path = os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(f.filename)) f.save(save_full_path) return 'file uploaded successfully' - 第四步:排查容易忽略的权限坑
- 确认你的上传目录没有设置成700权限的私人目录(比如直接存在你的ubuntu用户家目录~下没有放开进入权限),否则运行服务的用户根本没有权限进入目录写文件
- 如果用了systemd托管Flask服务,要在服务配置文件里确认
User字段指定的运行用户和你赋权的用户是同一个,避免给错了用户的权限 - 不要把上传目录设置成根目录/或者/root这类系统级受限目录,这类目录默认对服务用户没有写权限
内容的提问来源于stack exchange,提问作者Python 123
相关产品推荐
相关产品推荐

