Django S3 : UnicodeDecodeError: 'utf-8' кодек не может декодировать байт 0xff в позиции 0: недопустимый начальный байт

Я пытаюсь использовать s3 для получения изображений на моем сайте.

Я пытаюсь использовать функцию get_object() для доступа к объекту изображения.

Частью объекта, которую я хочу вернуть, является Body, тип которого - StreamingBody. Я хочу преобразовать StreamingBody в строку, чтобы вернуть ее.

Вот мой код :

def get_image_link(image):
    """Get image link"""
    key = "media/" + str(image)
    s3 = boto3.client('s3', config=Config(signature_version='s3v4', region_name=settings.AWS_S3_REGION_NAME))
    obj = s3.get_object(Bucket=settings.AWS_STORAGE_BUCKET_NAME, Key=key)
    return obj['Body'].read().decode('utf-8')

obj['Body'].read() возвращают байты, которые я пытаюсь декодировать в utf-8.

Когда я запускаю obj['Body'].read().decode('utf-8'), я получаю эту ошибку : UnicodeDecodeError: 'utf-8' кодек не может декодировать байт 0xff в позиции 0: недопустимый начальный байт

Заранее благодарю за помощь

Зависит от того, что именно вы хотите сделать:

Отобразить изображение:

from django.http import HttpResponse
from rest_framework.decorators import api_view


@api_view(['GET'])
def get_image(request, image):
    ...
    
    data = obj['Body'].read()

    return HttpResponse(data, content_type=obj["ContentType"])

Display base64 Data URL

import base64

from django.http import HttpResponse
from rest_framework.decorators import api_view


@api_view(['GET'])
def get_image(request, image):
    ...
    
    data = obj['Body'].read()
    base64_data = base64.b64encode(data).decode("utf-8")

    return HttpResponse(f'<img src="data:{obj["ContentType"]};base64,{base64_data}">')

Похоже, что вы используете Django REST framework, поэтому если вы хотите вернуть JSON, вам придется закодировать его с помощью bas64, например:

import base64

from rest_framework.decorators import api_view
from rest_framework.response import Response


@api_view(['GET'])
def get_image(request, image):
    ...
    
    data = obj['Body'].read()
    base64_data = base64.b64encode(data).decode("utf-8")

    return Response(base64_data)
Вернуться на верх