django admin:像base64一样保存图像
django admin: save image like base64
我想通过 django 管理面板上传图片,但我需要将其保存为数据库中的 base64 字符串
我该怎么做?
+
- 我想在管理中查看图像
- DB 可能有一天会移动,最好只保存 base64 字符串,所以我不会依赖某些文件结构(好像我会在某处存储原始图像)
ps。我有 django 2.2.6 版本
将图像保存在数据库中被认为是一种不好的做法,最好使用 django-storages 并将图像保存到一些外部 S3 兼容的存储服务中。
如果你坚持你的方法:为了能够通过 Django 管理上传图像并将它们存储为 base64,你需要在你的模型中使用一个保存方法将你的图像编码为 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 字段。如果你想在 Admin 的 Base64 字段中显示它,那么你可以将它保存为 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)
我想通过 django 管理面板上传图片,但我需要将其保存为数据库中的 base64 字符串 我该怎么做? +
- 我想在管理中查看图像
- DB 可能有一天会移动,最好只保存 base64 字符串,所以我不会依赖某些文件结构(好像我会在某处存储原始图像)
ps。我有 django 2.2.6 版本
将图像保存在数据库中被认为是一种不好的做法,最好使用 django-storages 并将图像保存到一些外部 S3 兼容的存储服务中。
如果你坚持你的方法:为了能够通过 Django 管理上传图像并将它们存储为 base64,你需要在你的模型中使用一个保存方法将你的图像编码为 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 字段。如果你想在 Admin 的 Base64 字段中显示它,那么你可以将它保存为 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)