使用Pillow访问数据会在Django Rest Framework中响应时将其损坏(您上传的文件不是图像或图像损坏。)

问题描述 投票:0回答:1

我想从序列化器中的上传图像中提取formatmode参数并动态更新我的字段。这是代码...

class ImageDataSerializer(serializers.ModelSerializer):
class Meta:
    model = models.ImageData
    exclude = ['height','width']

在我看来

    serializer = serializer(data=request.data,partial=True)
    serializer.is_valid(raise_exception=True)
    obj = serializer.save(user=request.user,extension="PNG",image_type="RGB")     
    return Response(serializer.data) 

这很好用。我正在将我的InMemeoryUploadedFile实例作为数据发送,并且序列化程序将其保存到数据库中。但是,我想使用Pillow库自动确定扩展名和image_type。到目前为止,这是我尝试过的...

class ImageDataSerializer(serializers.ModelSerializer):
def __init__(self,*args,**kwargs):
    super(ImageDataSerializer,self).__init__(*args,**kwargs)
    myimage = self.initial_data['data']
    with Image.open(myimage) as myimage:
        self.fields['extension'].initial = myimage.format
        self.fields['image_type'].initial = myimage.mode
    # Update the extension and image_type initial values
class Meta:
    model = models.ImageData
    exclude = ['height','width']

发生什么情况,我的图像文件已损坏,在响应中,我收到消息“上传有效的图像。您上传的文件不是图像或损坏的图像。”我也尝试过确定视图中的扩展名和模式,并将其传递给request.data字典,但是使用Pillow.Image.open()一次访问图像文件会损坏它。

django django-rest-framework python-imaging-library django-serializer
1个回答
0
投票

问题是光标。使用Pillow打开文件后,您需要将光标重置到文件的开头,以供Django将来使用。以下是完整的工作代码。

class ImageDataSerializer(serializers.ModelSerializer):
def __init__(self,*args,**kwargs):
    data = kwargs.get("data",None)
    img = data.get("data",None)
    with Image.open(img) as myimage:
        data['extension'] = myimage.format
        data['image_type'] = myimage.mode

    img.seek(0)       
    super(ImageDataSerializer,self).__init__(*args,**kwargs)



class Meta:
    model = models.ImageData
    exclude = ['height','width']
    read_only_fields = ['user']

img.seek(0)将光标重置到文件的开头

© www.soinside.com 2019 - 2024. All rights reserved.