【发布时间】:2021-03-28 21:28:30
【问题描述】:
我想通过 django 管理面板上传图片,但我需要将其保存为数据库中的 base64 字符串 我怎么能做到? +
- 我想在管理员中查看图片
- DB 可能有一天会移动,最好只保存 base64 字符串,所以我不会依赖某些文件结构(好像我会在某处存储原始图像)
ps。我有 django 2.2.6 版本
【问题讨论】:
标签: python django django-2.2
我想通过 django 管理面板上传图片,但我需要将其保存为数据库中的 base64 字符串 我怎么能做到? +
ps。我有 django 2.2.6 版本
【问题讨论】:
标签: python django django-2.2
将图像保存在数据库中被认为是一种不好的做法,最好使用 django-storages 并将图像保存到一些外部 S3 兼容的存储服务。
如果您坚持您的方法:为了能够通过 Django 管理员上传图像并将它们存储为 base64,您需要在模型中使用 save 方法将图像编码为 b64 并将数据保存在字段中。比如:
import base64
class Image(models.Model):
...
image_file = models.ImageField(upload_to='images/', default='blank.jpg')
image_b64 = models.BinaryField(blank=True, null=True)
def save(self, *args, **kwargs):
if self.image_file:
img_file = open(self.image_file.url, "rb")
self.image_b64 = base64.b64encode(img_file.read())
super(Image, self).save(*args, **kwargs)
您可以在 Admin 上显示 ImageField,通过 admin.py 删除 Base64 字段。如果您想从 Base64 字段在 Admin 中显示它,那么您可以将其保存为添加标签的 html 字符串(也可以在 admin.py 中使用图像小部件设置该字段以显示它)。模型可能类似于:
class Image(models.Model):
...
image_file = models.ImageField(upload_to='images/', default='blank.jpg')
image_b64 = models.TextField(blank=True)
def save(self, *args, **kwargs):
if self.image_file:
img_file = open(self.image_file.url, "rb")
data = base64.b64encode(img_file.read())
self.image_b64 = format_html('<img src="data:;base64,{}">', data)
super(Image, self).save(*args, **kwargs)
【讨论】:
self.default_image_bs64 = base64.b64encode(self.default_image_file.read())