fix: Add fallback support for old image file formats
- Added default_storage import to ImageService - Implemented fallback logic in get_url() method - First tries new format (.webp for non-original, .jpg for original) - Falls back to old format (all .jpg) for backward compatibility - Ensures old photos continue to work with new configuration - Prevents broken links when migrating to new format This allows gradual transition from old to new image format without breaking existing image links. 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -4,6 +4,7 @@
|
|||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
from django.core.files.storage import default_storage
|
||||||
|
|
||||||
|
|
||||||
class ImageService:
|
class ImageService:
|
||||||
@@ -97,13 +98,34 @@ class ImageService:
|
|||||||
if len(parts_of_name) == 2:
|
if len(parts_of_name) == 2:
|
||||||
base_filename, file_size_key = parts_of_name
|
base_filename, file_size_key = parts_of_name
|
||||||
# Это новый формат с явным указанием размера в имени
|
# Это новый формат с явным указанием размера в имени
|
||||||
|
|
||||||
# Получаем расширение для целевого размера
|
# Получаем расширение для целевого размера
|
||||||
target_ext = ImageService._get_file_extension(size)
|
target_ext = ImageService._get_file_extension(size)
|
||||||
# Меняем размер в имени файла и расширение
|
|
||||||
filename = f"{base_filename}_{size}.{target_ext}"
|
# Строим папку
|
||||||
|
size_folders = ImageService._get_size_folders()
|
||||||
|
folder = size_folders.get(size, 'medium')
|
||||||
|
|
||||||
|
# Сначала пытаемся с правильным расширением из конфигурации
|
||||||
|
filename_new = f"{base_filename}_{size}.{target_ext}"
|
||||||
|
new_path_primary = f"{base_path}/{folder}/{filename_new}"
|
||||||
|
|
||||||
|
# Если файл существует - возвращаем его
|
||||||
|
if default_storage.exists(new_path_primary):
|
||||||
|
return f"{settings.MEDIA_URL}{new_path_primary}"
|
||||||
|
|
||||||
|
# Иначе пробуем старый формат (все .jpg) для совместимости
|
||||||
|
filename_fallback = f"{base_filename}_{size}.jpg"
|
||||||
|
new_path_fallback = f"{base_path}/{folder}/{filename_fallback}"
|
||||||
|
|
||||||
|
if default_storage.exists(new_path_fallback):
|
||||||
|
return f"{settings.MEDIA_URL}{new_path_fallback}"
|
||||||
|
|
||||||
|
# Если ничего не найдено, возвращаем путь с новым расширением (браузер покажет ошибку)
|
||||||
|
return f"{settings.MEDIA_URL}{new_path_primary}"
|
||||||
# Иначе оставляем как есть
|
# Иначе оставляем как есть
|
||||||
|
|
||||||
# Строим новый путь
|
# Строим новый путь (для старых файлов без новой структуры)
|
||||||
size_folders = ImageService._get_size_folders()
|
size_folders = ImageService._get_size_folders()
|
||||||
folder = size_folders.get(size, 'medium')
|
folder = size_folders.get(size, 'medium')
|
||||||
new_path = f"{base_path}/{folder}/{filename}"
|
new_path = f"{base_path}/{folder}/{filename}"
|
||||||
|
|||||||
Reference in New Issue
Block a user