Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # shared/models/utils.py
- import base64
- import mimetypes
- import re
- import six
- import uuid
- from django.core.files.base import ContentFile
- from django.utils.functional import LazyObject
- class Base64ImageConverter:
- @staticmethod
- def decode_file(data):
- if isinstance(data, six.string_types):
- _data = re.sub(r"^data\:.+base64\,(.+)$", r"\1", data)
- try:
- return base64.b64decode(_data)
- except Exception as exception:
- pass
- return
- def convert(self, data):
- file_name, delim, content = str(data).partition(';')
- decoded_data = self.decode_file(content)
- if not decoded_data:
- return
- return ContentFile(decoded_data, name=file_name)
- class DefaultBase64ImageConverter(LazyObject):
- def _setup(self):
- self._wrapped = Base64ImageConverter()
- default_base64_file_converter = DefaultBase64ImageConverter()
- # shared/rest/fields.py
- from django.utils.translation import ugettext_lazy as _
- from rest_framework.serializers import FileField, ImageField
- from ..models.utils import default_base64_file_converter
- class Base64FileFieldMixin:
- message = None
- def __init__(self, message=None, **kwargs):
- super().__init__(**kwargs)
- if message:
- self.message = message
- def to_internal_value(self, data):
- try:
- data = default_base64_file_converter.convert(data)
- except Exception as ex:
- self.fail(self.message)
- return super().to_internal_value(data)
- class Base64FileSerializerField(Base64FileFieldMixin, FileField):
- message = _("Invalid file was passed")
- class Base64ImageSerializerField(Base64FileFieldMixin, ImageField):
- message = _("Invalid image was passed")
Add Comment
Please, Sign In to add comment