LexxXell
@LexxXell
Программист и немного IT-журналист

Почему возникает ошибка при сериализации имени файла?

Сайт на Django.

Зависимые пакеты:
django 3.0.5
djangorestframework 3.11.0

При аплоаде файлов с определенными названиями сериалайзер выдаёт невалидность. Например такое название крашит сериализацию "2 Sub Urban ft. Rei Ami - Freak (Рус Кавер Oxygen1um ft. Lil Key) ▶ Песня На Русском - Оксигениум Перевод Rus Cover.mp4" (Я понимаю, что название слишком "хитровыделанное", но ничего не могу поделать - пользователи такое пытаются загрузить)

Код сериалайзера

class ClipVideoFileSerializer(serializers.ModelSerializer):
"""Clip VideoFile Serializer"""

class Meta:
    model = Clip
    fields = "__all__"
    read_only_fields = ('error', 'converted', 'is_playing', 'clip_duration',)


Код вьюхи

class ClipView(APIView):
"""Clip View"""

parser_classes = (MultiPartParser, FormParser, JSONParser)

object_serializer = ClipSerializer
object_get_serializer = ClipGetSerializer
video_file_serializer = ClipVideoFileSerializer
json_object_name = "clip"

"""

Часть несвязанного с проблемой кода скрыта

"""

def put(self, request):
    if request.data.get(self.json_object_name):

        """ Часть несвязанного с проблемой кода скрыта """

        """ При аплоаде выполняется блок elif """

    elif request.data.get("video_file") is not None and request.data.get("id") is not None:
        instance = get_object_or_404(Clip.objects.all(), pk=request.data.get("id"))

        """ Часть несвязанного с проблемой кода скрыта """

        file_serializer = self.video_file_serializer(
            instance=instance,
            data=request.data,
            partial=True
        )
        if file_serializer.is_valid():

            """ Часть несвязанного с проблемой кода скрыта """

        else:
            data = request.data
            return self.get(request, context={"detail": "update error", "id": data.get("id"),
                                              "convertation_status": "error"})
    else:
        return self.get(request, context={"error": "bad request"})

"""

Часть несвязанного с проблемой кода скрыта

"""


Модель
class Clip(models.Model):
    """Clip"""
    
    """ Часть несвязанного с проблемой кода скрыта """

    name = models.CharField("Clip name", max_length=150, default="NoName")
    video_file = models.FileField("Clip", upload_to="clips", null=True, blank=True)

    """ Часть несвязанного с проблемой кода скрыта """


Если у файлов простые названия (например "video_bla_bla.mp4") то проблем с загрузкой не возникает.

Пытался при сохранении менять имя используя django-hashedfilenamestorage, но безрезультатно.

Есть возможность еще на фронте менять имя отправляемого файла, но это - костыль, ведь на бэке так и будет вероятность ошибки из-за имени.

Как мне решить эту проблему?
  • Вопрос задан
  • 78 просмотров
Решения вопроса 1
LexxXell
@LexxXell Автор вопроса
Программист и немного IT-журналист
Проверить какую ошибку выдаёт сериалайзер:
print(file_serializer.errors)
В конкретном случае ошибка в превышении длины строки имени файла:
{'video_file': [ErrorDetail(string='Ensure this filename has at most 100 characters (it has 120).', code='max_length')]}

По умолчанию длина была 100 символов.

Решение - указать большую длину имени файла:
video_file = models.FileField("Clip", upload_to=get_new_video_file_path, null=True, blank=True, max_length=255)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы