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 并尝试停用序列化程序而没有效果。
您可以使用base64模块将图像文件编码为 base64 格式(原始字符串),然后将其分配给字段以传输图像。
我已更新您ImageSerializer以包含一个名为base64_imagebase64 格式的模型图像文件编码的新文件。
以下示例供您参考:
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)
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)
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格式转换回图像原始数据。
document.getElementById('img').setAttribute( 'src', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEU.......');
Run Code Online (Sandbox Code Playgroud)
如何使用 Objective C 解码 BASE64 编码的 PNG
如何将 Base64 字符串转换为 BitMap 图像以在 ImageView 中显示?
我已将示例上传到GitHub。希望它会有所帮助。
| 归档时间: |
|
| 查看次数: |
4390 次 |
| 最近记录: |