Django Rest Framework: невозможно сериализовать или сохранить загруженное изображение

Невозможно сериализовать или сохранить загруженное изображение в APIview. При сохранении файл поврежден и не может быть открыт. При сериализации получим:{"avatar": ["Файл не был отправлен".]} Запрос содержимого:

MultiValueDict: {u'name': [<TemporaryUploadedFile: Avatar.jpg (image/jpeg)>]}

Настройки:

FILE_UPLOAD_HANDLERS = [
'django.core.files.uploadhandler.TemporaryFileUploadHandler',
]
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(PROJECT_DIR, 'media')

URL-адрес:

urlpatterns = [
url(r'^test/$', TestReturn.as_view(), name='test-detail'),
url(r'^users/$', UserProfileAll.as_view(), name='userprofile-detail'),
url(r'^avatar/', UploadAvatar.as_view(), name='images')

] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Модель:

class AvatarStorage(models.Model):
avatar = models.ImageField(verbose_name="Uploaded image", upload_to='media', null=True)

Serialzier:

class AvatarStorageSerializer(serializers.ModelSerializer):
avatar = serializers.ImageField(use_url=True)

class Meta:
    model = AvatarStorage

    fields = '__all__'

Просмотры:

class UploadAvatar(APIView):
parser_classes = (MultiPartParser,)

def post(self, request, format=None):

    serializer = AvatarStorageSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Для публикации я использую Почтальон, там настройки: Body=>Form-Data и выбор файла с диска.

Если это важно, это API для мобильных устройств

2 ответа

Решение

Проблема была не в коде, мне не хватало необходимых заголовков в Почтальоне:

Content-Disposition: attachment; filename=upload.jpg;

Обновите файлы настроек FILE_UPLOAD_HANDLERS, чтобы это понравилось

FILE_UPLOAD_HANDLERS=[
    'django.contrib.staticfiles.finders.MemoryFileUploadHandler',
    'django.contrib.staticfiles.finders.TemporaryFileUploadHandler',
]

если вы хотите узнать больше, прочитайте это

Другие вопросы по тегам