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

Ubuntu服务器Django+Apache2图片上传权限拒绝问题求助

解决Django上传图片报错Permission denied: '/photos'的问题

1. 优先检查Django的上传路径配置

错误提示的路径是根目录下的/photos,但你的实际照片目录在/var/www/html/api/photos,大概率是Django代码里的路径配置写错了:

  • 打开apiMain/settings.py,找到MEDIA_ROOT或自定义的上传目录配置,确保使用正确的绝对路径:
    import os
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    # 正确指向项目内的photos目录
    MEDIA_ROOT = os.path.join(BASE_DIR, 'photos')
    MEDIA_URL = '/photos/'
    
  • 如果是视图/序列化器里硬编码了上传路径(比如open('/photos/xxx.jpg', 'wb')),必须改成基于项目根目录的路径:
    upload_path = os.path.join(BASE_DIR, 'photos', filename)
    with open(upload_path, 'wb') as f:
        f.write(...)
    

2. 确保目录权限正确配置

重新执行以下命令,确保目录权限和所有者设置生效:

# 将目录所有者改为Apache运行用户www-data
sudo chown -R www-data:www-data /var/www/html/api/photos
# 设置目录权限为755(允许用户读写执行,组和其他读执行)
sudo chmod -R 755 /var/www/html/api/photos

3. 完善Apache的mod_wsgi配置

你的WSGIDaemonProcess未明确指定运行用户,添加用户组配置确保进程以www-data身份运行:
修改/etc/apache2/apache2.conf中的对应行:

WSGIDaemonProcess x_api python-home=/var/www/html/api/venv python-path=/var/www/html/api user=www-data group=www-data

然后重启Apache:

sudo systemctl restart apache2

4. 排查SELinux(如果启用)

Ubuntu默认禁用SELinux,但如果你的系统手动开启了,需要给照片目录添加正确的上下文:

sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/api/photos(/.*)?"
sudo restorecon -Rv /var/www/html/api/photos

可通过sestatus命令查看SELinux是否启用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:46:06