Django误删S3存储配置后,如何恢复未上传至S3的图片?
恢复未上传至S3的图片方案
删除DEFAULT_FILE_STORAGE配置后,Django会自动切换回默认的FileSystemStorage,这段时间上传的图片实际存储在你服务器的MEDIA_ROOT目录下——数据库里的CloudFront格式路径只是保留了之前的URL规则,但文件并没有同步到S3。按以下步骤尝试恢复:
第一步:确认本地文件是否存在
登录应用服务器,找到settings.py中MEDIA_ROOT对应的目录(通常是项目根目录下的media文件夹),按照数据库里的路径结构(比如profile_pictures/kupp.jpg)检查文件。只要服务器没清理过这个目录,文件大概率还在。第二步:批量同步本地文件到S3
- 先恢复S3存储配置:把
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'加回settings.py,同时确保AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_STORAGE_BUCKET_NAME等S3相关配置正确。 - 写一个简单的Django脚本(或管理命令)批量上传本地文件:
运行脚本后,本地未上传的文件会被同步到S3对应路径下。import os from django.core.files.storage import default_storage from django.conf import settings def sync_local_media_to_s3(): media_root = settings.MEDIA_ROOT # 遍历本地media目录下的所有文件 for root, _, files in os.walk(media_root): for file_name in files: local_file_path = os.path.join(root, file_name) # 计算相对MEDIA_ROOT的路径,作为S3的存储键 s3_file_key = os.path.relpath(local_file_path, media_root) # 避免重复上传,先检查S3是否已有该文件 if not default_storage.exists(s3_file_key): with open(local_file_path, 'rb') as f: default_storage.save(s3_file_key, f) print(f"已上传: {s3_file_key}")
- 先恢复S3存储配置:把
第三步:验证访问有效性
上传完成后,直接访问数据库里保存的CloudFront链接即可。只要CloudFront配置正确(指向对应的S3存储桶),图片就能正常加载,无需修改数据库中的路径。特殊情况处理
如果服务器的MEDIA_ROOT目录已被清理,只能从数据库备份、服务器快照这类备份渠道找回文件后再同步。如果没有任何备份,这些图片可能无法恢复。
内容的提问来源于stack exchange,提问作者Mike D Hovhannisyan
相关产品推荐
相关产品推荐

