编码 Base64 Django ImageField 流
Encode Base64 Django ImageField Stream
我通过我的表单收到一张图片,我不想像往常一样将其保存在 FileField
中,而是在 CharField
中保存为 Base64。这是我当前的设置:
models.py
class Image(models.Model):
company = models.ForeignKey(Company)
img = models.TextField()
img_id = models.CharField(blank=True, null=True, max_length=64)
img_class = models.CharField(blank=True, null=True, max_length=64)
created = models.DateField(auto_now_add=True, editable=False)
forms.py
class ImageForm(forms.Form):
img = forms.ImageField()
img_id = forms.CharField(required=False)
img_class = forms.CharField(required=False)
views.py
class ImageUploadView(LoginRequiredMixin, FormView):
form_class = ImageForm
template_name = "upload.html"
success_url = reverse_lazy("home")
def form_valid(self, form):
account = Account.objects.get(user=self.request.user)
html = Html.objects.get(company=account.company)
if self.request.user.is_authenticated():
company = Company.objects.get(account=account)
form_img = form.cleaned_data['img']
print(form_img.__dict__.keys())
print(form_img.image)
return super(ImageUploadView, self).form_valid(form)
print(form_img.__dict__.keys())
的输出是
['file', 'content_type_extra', 'image', 'charset', '_name', 'content_type', '_size', 'field_name']
对于 Png 图像 print(form_img.image)
的输出是:
<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=183x161 at 0x7F087B2E6B90>
对于 JPG,它是:
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=400x400 at 0x7F087B16EC50>
是否可以将接收到的图像编码为base64,并将其从流中保存到数据库中,而不是暂时保存在某个地方?
编辑: 现在可以使用了!
b64_img = base64.b64encode(form_img.file.read())
这基本上就是一切!
是的,使用 PIL 可以轻松做到!
如何:
将图像保存在缓冲区中并以 base64 编码。
import base64
import cStringIO
img_buffer = cStringIO.StringIO()
image.save(img_buffer, format="imageFormatYouWant")
img_str = base64.b64encode(img_buffer.getvalue())
或:
with open("yourImage.ext", "rb") as image_file:
encoded_string = base64.b64encode(image_file.read())
我通过我的表单收到一张图片,我不想像往常一样将其保存在 FileField
中,而是在 CharField
中保存为 Base64。这是我当前的设置:
models.py
class Image(models.Model):
company = models.ForeignKey(Company)
img = models.TextField()
img_id = models.CharField(blank=True, null=True, max_length=64)
img_class = models.CharField(blank=True, null=True, max_length=64)
created = models.DateField(auto_now_add=True, editable=False)
forms.py
class ImageForm(forms.Form):
img = forms.ImageField()
img_id = forms.CharField(required=False)
img_class = forms.CharField(required=False)
views.py
class ImageUploadView(LoginRequiredMixin, FormView):
form_class = ImageForm
template_name = "upload.html"
success_url = reverse_lazy("home")
def form_valid(self, form):
account = Account.objects.get(user=self.request.user)
html = Html.objects.get(company=account.company)
if self.request.user.is_authenticated():
company = Company.objects.get(account=account)
form_img = form.cleaned_data['img']
print(form_img.__dict__.keys())
print(form_img.image)
return super(ImageUploadView, self).form_valid(form)
print(form_img.__dict__.keys())
的输出是
['file', 'content_type_extra', 'image', 'charset', '_name', 'content_type', '_size', 'field_name']
对于 Png 图像 print(form_img.image)
的输出是:
<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=183x161 at 0x7F087B2E6B90>
对于 JPG,它是:
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=400x400 at 0x7F087B16EC50>
是否可以将接收到的图像编码为base64,并将其从流中保存到数据库中,而不是暂时保存在某个地方?
编辑: 现在可以使用了!
b64_img = base64.b64encode(form_img.file.read())
这基本上就是一切!
是的,使用 PIL 可以轻松做到!
如何:
将图像保存在缓冲区中并以 base64 编码。
import base64
import cStringIO
img_buffer = cStringIO.StringIO()
image.save(img_buffer, format="imageFormatYouWant")
img_str = base64.b64encode(img_buffer.getvalue())
或:
with open("yourImage.ext", "rb") as image_file:
encoded_string = base64.b64encode(image_file.read())