求助:如何解决DigitalOcean上django-filer文件下载404错误?
问题描述
- 在DigitalOcean部署的django-cms应用中,用filer创建文件夹、上传文件都正常,但下载已上传文件时返回404错误
- 示例文件URL:
https://my_app.ondigitalocean.app/en/media/filer_public/39/d9/39d9ff20-1aa8-48e5-9b8f-113fc71e534b/atest.pdf/ - 文件已确认存在于服务器文件系统中
- settings.py相关配置:
MEDIA_URL = "media/" MEDIA_ROOT = str(BASE_DIR / "media") - 本地开发环境
DEBUG=True时一切正常,DEBUG=False时同样出现404错误
解决方法
1. 适配多语言URL前缀的媒体路由
django-cms的多语言中间件会给URL加上语言前缀(比如/en/),但Django默认的媒体文件路由不会自动处理这个前缀,导致请求路径和实际文件路径不匹配。
修改项目根urls.py,添加能匹配带语言前缀的媒体请求路由:
from django.conf import settings from django.conf.urls.static import static from django.urls import path, re_path from django.views.static import serve urlpatterns = [ # 保留你已有的其他路由 ] # 生产环境(DEBUG=False)下处理媒体文件请求 if not settings.DEBUG: # 匹配带语言前缀的/media/路径 urlpatterns += [ re_path(r'^[a-z]{2}/media/(?P<path>.*)$', serve, { 'document_root': settings.MEDIA_ROOT, }), # 同时兼容不带语言前缀的请求(如果有需要) re_path(r'^media/(?P<path>.*)$', serve, { 'document_root': settings.MEDIA_ROOT, }), ] # 开发环境仍用默认static处理 else: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
2. 检查DigitalOcean App Platform的媒体文件配置
如果是用App Platform部署,需要确认平台正确映射了媒体目录:
- 进入App Platform的应用设置,找到「静态资源/Assets」配置项
- 添加映射规则:将
/media/路径指向服务器上的media目录(对应你的MEDIA_ROOT) - 注意要确保平台能正确转发
/en/media/这类带语言前缀的请求到媒体目录
3. 验证服务器文件权限
上传正常不代表下载时权限没问题,需要确保Web服务器进程能读取媒体文件:
- 执行以下命令调整权限(以Ubuntu服务器为例):
sudo chown -R www-data:www-data /path/to/your/app/media sudo chmod -R 755 /path/to/your/app/media - 替换
/path/to/your/app为你实际的项目根目录路径
4. 确认django-filer的URL配置
检查filer的相关设置,确保URL生成逻辑正确:
- 确认
FILER_PUBLICMEDIA_PREFIX(默认是filer_public/)和你的URL路径匹配,这部分通常默认配置就没问题 - 可以在Django shell中打印文件对象的
url属性,确认生成的路径是否正确
内容的提问来源于stack exchange,提问作者Rockbot
相关产品推荐
相关产品推荐

