Django S3:UnicodeDecodeError:“utf8”编解码器无法解码位置0中的字节0xff:无效的开始字节

2024-09-27 07:29:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用s3在我的网站上获取图像

我正在尝试使用get_object()访问图像对象

我想返回的对象部分是Body,它的类型是StreamingBody。 我想将StreamingBody转换为字符串以返回它

这是我的密码:

@api_view(['GET'])
def get_image(request, 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 Response(obj['Body'].read().decode('utf-8'))

url.py

from django.urls import path
from store import views

urlpatterns = [
    path('images/<str:image>', views.get_image),
]

obj['Body'].read()返回我试图在utf-8中解码的字节

运行obj['Body'].read().decode('utf-8')时,出现以下错误:UnicodeDecodeError:'utf-8'编解码器无法解码位置0中的字节0xff:无效的开始字节

提前感谢您的帮助

更新

我必须以HttpResponse的形式返回图像数据,并且不进行编码:

image_data = obj['Body'].read()    
return HttpResponse(image_data, content_type="image/jpeg")

Tags: 对象key图像imageobjreadget字节
1条回答
网友
1楼 · 发布于 2024-09-27 07:29:55

这取决于你到底想做什么:

显示图像:

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"])

显示base64{a1}

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)

相关问题 更多 >

    热门问题