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

Django配置对象存储后,图片未存入对象存储而是本地目录

问题:Django+DRF集成对象存储时图片仍存本地

我在基于Django、DRF和PostgreSQL的项目中集成对象存储,目标是通过API接口上传图片到对象存储,但调用接口执行上传操作时,图片却被存储在本地项目的base_dir/media目录下。PostgreSQL数据库中存储的是对象存储中的图片URL,但实际图片并未上传到对象存储。我已经检查过凭证、媒体文件和运行时值,重新配置设置也没解决问题。

模型代码

class Announcement(models.Model):
    image = models.ImageField(upload_to='media/')

当前boto3存储配置

AWS_ACCESS_KEY_ID = os.environ.get('DO_SPACES_KEY')
AWS_SECRET_ACCESS_KEY = os.environ.get('DO_SPACES_SECRET')
AWS_STORAGE_BUCKET_NAME = os.environ.get('DO_SPACES_BUCKET')
AWS_S3_ENDPOINT_URL = os.environ.get('DO_SPACES_ENDPOINT')
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}
AWS_LOCATION = 'media'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]
STATIC_URL = 'https://%s/%s/' % (AWS_S3_ENDPOINT_URL, 'static')
MEDIA_URL = 'https://%s/%s/' % (AWS_S3_ENDPOINT_URL, AWS_LOCATION)
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

解决方案

  • 你只配置了静态文件的存储后端,媒体文件的存储后端未指定,Django默认会使用本地存储。需要在配置中添加:
    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
    
    这样模型的ImageField上传时才会调用S3存储后端。
  • 注意路径重复问题:模型中upload_to='media/'和配置里的AWS_LOCATION = 'media'会导致最终存储路径变成media/media/xxx.jpg,可以把模型里的upload_to改为空字符串或其他子目录,避免路径冗余。
  • 确认环境变量正确加载:检查DO_SPACES_KEY、DO_SPACES_SECRET等环境变量是否在运行环境中正确设置,若凭证为空,Django会自动 fallback 到本地存储。
  • 调试验证:可以在视图或管理命令中打印配置值,比如print(settings.DEFAULT_FILE_STORAGE),确认媒体存储后端是否正确设置为S3存储。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:10:04