gpt4 book ai didi

Django 休息框架 : How to download image with this image send directly in the body

转载 作者:行者123 更新时间:2023-12-04 01:47:15 26 4
gpt4 key购买 nike

我需要在正文请求中直接返回一个图像,但我得到一个没有扩展名的生成文件和一个空数组/json 的响应...

我正在使用 python 3,Django==1.10.5 和 djangorestframework==3.5.3

我的模型.py

class Image(models.Model):
class Meta:
verbose_name = _('Image')
verbose_name_plural = _('Images')

creation_date = models.DateTimeField(
help_text=_('Creation date'),
auto_now_add=True,
editable=False
)

modified_date = models.DateTimeField(
help_text=_('Last modification date'),
auto_now=True
)

image_file = models.ImageField(upload_to='', null=True)

我的序列化程序.py

class ImageSerializer(serializers.ModelSerializer):

class Meta:
model = Image
fields = ('image_file',)

我的观点.py

class ImageViewSet(NestedViewSetMixin, viewsets.ModelViewSet):

http_method_names = ['get', 'put']
queryset = Image.objects.all()
serializer_class = ImageSerializer
pagination_class = None

def get_queryset(self, *args, **kwargs):

image = Image.objects.last()
filename = image.image_file
size = filename.size
response = FileResponse(open(filename.path, 'rb'), content_type="image/png")
response['Content-Length'] = size
response['Content-Disposition'] = "attachment; filename=%s" % 'notification-icon.png'
return response

如果有人发现我做错了什么,我将不胜感激。非常感谢;p

编辑:我已经尝试使用 django.core.files.File、filewrapper 并尝试停用序列化程序但没有效果。

最佳答案

您可以使用base64模块将图像文件编码为base64格式(原始字符串),然后将其分配给一个字段以传输您的图像。

我已经更新了您的 ImageSerializer 以包含一个名为 base64_image 的新文件,该文件是从模型的图像文件以 base64 格式编码而来的。

以下示例供您引用:

序列化程序.py
from django.core.files import File
import base64

class ImageSerializer(serializers.ModelSerializer):

base64_image = serializers.SerializerMethodField()

class Meta:
model = Image
fields = ('base64_image', 'id')

def get_base64_image(self, obj):
f = open(obj.image_file.path, 'rb')
image = File(f)
data = base64.b64encode(image.read())
f.close()
return data

View .py
class ImageViewSet(viewsets.ModelViewSet):
http_method_names = ['get', 'put']
queryset = Image.objects.all()
serializer_class = ImageSerializer
pagination_class = None

urls.py
from rest_framework.routers import DefaultRouter

# Register viewset
router = DefaultRouter()
router.register(r'image', ImageViewSet)
urlpatterns += router.urls

最后,你可以用url打开浏览器:http://localhost:8000/image/,你会得到这样的响应:

[
{
"base64_image": "iVBORw0KGg.....",
"id": 1
}
]

如何在前端或应用中显示您的图片?

当你的前端拿到上面的json后,你需要将base64格式转换回图片原始数据。

对于 Javascript:

document.getElementById('img').setAttribute( 'src', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEU.......');

How can I set Image source with base64

对于 iOS:

how to decode BASE64 encoded PNG using Objective C

对于安卓:

How to convert a Base64 string into a BitMap image to show it in a ImageView?

我已经上传了一个例子到GitHub .希望对您有所帮助。

关于Django 休息框架 : How to download image with this image send directly in the body,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42874638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com