Содержание заголовков, включенных в файл, загружаемый в django rest framework

У меня возникла проблема с загрузкой файлов в django api. Когда я загружаю файл с помощью FileUploadParser, все идет хорошо, но загрузка файла содержит заголовок запроса, такой как Content-Disposition, когда я пытаюсь открыть загруженный файл, он ломается. Я долго искал решение, но безрезультатно. Решил использовать MultiPartparser, но в этом случае в дикту request.data ничего не попадает. Как я могу обойти это? Может ли кто-нибудь показать мне код или способ успешной загрузки файла или изображения в мой api без их поломки? Спасибо за любую подсказку.

Ну, я использую фреймворк flutter и загружаю изображения с мобильного в django, и знаете что, он обновляет поле изображения без каких-либо действий с моей стороны. Просто убедитесь, что там, откуда вы загружаете изображение, это делается соответственно библиотеке http в этом фреймворке.

Так что просто чтобы избежать этой головной боли для других людей. Вот что я нашел в итоге.

Я использовал FileUploadParser в своем uploadview. Но дело в том, что при использовании 'FileUploadParser' диктат request.data заполняется загруженным содержимым. Загруженное содержимое в этом случае, когда оно поступает от таких клиентов, как Postman или Insomnia, или Thunder Client из vscode, содержит единственный файл, который вы загрузили (мы предполагаем, что вы выбрали опцию бинарного запроса в этих клиентах), и таким образом, ничего плохого не происходит, файлы в безопасности. Но когда вы загружаете файлы из браузера, скажем, из angular, и класс_парсера в представлении установлен на FileUploadParser то вы успешно загрузите файл, но он будет сломан, потому что весь запрос (файл + заголовки и границы браузера) будет разобран как один файл FileUploadParser (это действительно его работа) и таким образом вы получите битые файлы на вашем сервере или бэкенде. Поэтому способ обойти это - установить parser_classes в MultipartParser и FormParser опционально. Таким образом, ваши загруженные файлы будут в порядке. И многое другое, вам не нужно указывать Content-Disposition: attachment; filename='некоторое имя файла' в заголовке запроса. Помните, что при использовании FileUploadParser ваш файл находится в request.data['file'], а при использовании MultiPartParser (и FormParser) файл находится в request.FILES['file'].

С учетом всего сказанного, рабочая версия представления загрузки, которую я разместил в своем вопросе, выглядит следующим образом :

class EstablishmentMediaUploadView(views.APIView):
    permission_classes = (IsAuthenticated,)
    authentication_class = JSONWebTokenAuthentication
    parser_classes = (MultiPartParser, FormParser,)
    name = 'mtp-establishment-media-file-upload'

    def post(self, request, *args, **kwargs):
        if 'file' not in request.FILES:
            return Response({"message": "Please provide a file"}, status=status.HTTP_400_BAD_REQUEST)
        establishmentid = kwargs.get('establishmentid')
        if establishmentid is None:
            return Response({"error": "You didn't specify the establishmentid"}, status=status.HTTP_400_BAD_REQUEST)
        mediaFile = request.FILES['file']
        media = Media.objects.create(mediatitle=mediaFile.name)
        media.establishmentlogo.save(mediaFile.name, mediaFile, save=True)
        try:
            establishment = Establishment.objects.get(id=establishmentid)
        except Establishment.DoesNotExist:
            return Response({"error": "Establishment does not exist"}, status=status.HTTP_404_NOT_FOUND)
        media.establishment = establishment
        media.save()
        return Response({"message": "Logo added for this establishment"}, status=status.HTTP_201_CREATED)


Вернуться на верх