Django rest 框架:如何使用此图像直接在正文中下载图像

Bat*_*Bat 3 django image download django-rest-framework

我需要直接在正文请求中返回一个图像,但是我得到了一个没有扩展名的生成文件和一个空数组/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)
Run Code Online (Sandbox Code Playgroud)

我的序列化程序.py

class ImageSerializer(serializers.ModelSerializer):

    class Meta:
        model = Image
        fields = ('image_file',)
Run Code Online (Sandbox Code Playgroud)

我的意见.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 
Run Code Online (Sandbox Code Playgroud)

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

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

Eni*_*nix 6

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

我已更新您ImageSerializer以包含一个名为base64_imagebase64 格式的模型图像文件编码的新文件。

以下示例供您参考:

序列化器.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
Run Code Online (Sandbox Code Playgroud)

视图.py

class ImageViewSet(viewsets.ModelViewSet):
    http_method_names = ['get', 'put']
    queryset = Image.objects.all()
    serializer_class = ImageSerializer
    pagination_class = None
Run Code Online (Sandbox Code Playgroud)

网址.py

from rest_framework.routers import DefaultRouter

# Register viewset
router = DefaultRouter()
router.register(r'image', ImageViewSet)
urlpatterns += router.urls
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用 url: 打开浏览器http://localhost:8000/image/,您将得到如下响应:

[
    {
        "base64_image": "iVBORw0KGg.....",
        "id": 1
    }
]
Run Code Online (Sandbox Code Playgroud)

如何在前端或应用程序中显示您的图像?

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

对于 JavaScript:

document.getElementById('img').setAttribute( 'src', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEU.......');
Run Code Online (Sandbox Code Playgroud)

如何使用 base64 设置图像源

对于 iOS:

如何使用 Objective C 解码 BASE64 编码的 PNG

对于安卓:

如何将 Base64 字符串转换为 BitMap 图像以在 ImageView 中显示?

我已将示例上传到GitHub。希望它会有所帮助。


归档时间:

查看次数:

4390 次

最近记录:

8 年,8 月 前