UTF8'编解码器不能解码位置15中的字节0x89:无效的起始字节

时间:2016-03-12 04:55:30

标签: django python-2.7 amazon-s3 django-rest-framework boto

这是我的项目视图,我尝试使用boto将图像从本地系统上传到s3。

class ImageList(generics.ListCreateAPIView):
        queryset = Image.objects.all()
        serializer_class = ImageSerializer

        def post(self , request , format = None):
            # import ipdb; ipdb.set_trace()
            serializer = ImageSerializer(data = request.data)
            if serializer.is_valid():
                serializer.save()
                print request.data
                return Response({'received data' : request.data})
            return Response(serializer.errors , status = status.HTTP_400_BAD_REQUEST)

class ImageDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Image.objects.all()
    serializer_class = ImageSerializer

它适用于django admin但在我尝试使用Django Rest Framework html表单上传时会产生错误。我在基于泛型类的视图中重写了post方法。生成的错误是:

UnicodeDecodeError at /image/
'utf8' codec can't decode byte 0xff in position 15: invalid start byte
Request Method: POST
Request URL:    http://127.0.0.1:8000/image/
Django Version: 1.9
Exception Type: UnicodeDecodeError
Exception Value:    
'utf8' codec can't decode byte 0xff in position 15: invalid start byte
Exception Location: /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py in encode, line 210
Python Executable:  /usr/bin/python
Python Version: 2.7.10
Unicode error hint

The string that could not be encoded/decoded was: "����\u

我已经尝试了几乎所有可用的堆栈溢出,但没有任何对我有用。我没有从某个地方复制代码,所以没有奇怪的字符。

作为参考,这是 models.py 文件:

class Image(models.Model):
    image_meta = models.ForeignKey('Image_Meta',on_delete=models.CASCADE,)
    image = models.ImageField(upload_to='images-data')
    # image = models.URLField(max_length = 500)
    order = models.IntegerField()
    version = models.CharField(max_length=10)

    def __unicode__(self):
            return (self.image)

有关详细信息,请参阅此处:enter image description here

1 个答案:

答案 0 :(得分:0)

JSON字符串是unicode字符串,而不是二进制字符串。您的图像包含二进制数据,JSON序列化程序正在抱怨这一点。

解决此问题的一种常见方法是使用base64或base85。 Python通过base64模块内置了对这两种(和其他)编码的支持。