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

时间:2019-12-18 20:17:12

标签: django django-rest-framework python-imaging-library django-serializer

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

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()一次访问图像文件会损坏它。

1 个答案:

答案 0 :(得分: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)将光标重置到文件的开头