kastielspb

Base64 rest file/image fields

Feb 8th, 2021
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.82 KB | None | 0 0
  1. # shared/models/utils.py
  2. import base64
  3. import mimetypes
  4. import re
  5. import six
  6. import uuid
  7.  
  8. from django.core.files.base import ContentFile
  9. from django.utils.functional import LazyObject
  10.  
  11.  
  12. class Base64ImageConverter:
  13.  
  14.     @staticmethod
  15.     def decode_file(data):
  16.         if isinstance(data, six.string_types):
  17.             _data = re.sub(r"^data\:.+base64\,(.+)$", r"\1", data)
  18.             try:
  19.                 return base64.b64decode(_data)
  20.             except Exception as exception:
  21.                 pass
  22.         return
  23.  
  24.     def convert(self, data):
  25.         file_name, delim, content = str(data).partition(';')
  26.         decoded_data = self.decode_file(content)
  27.         if not decoded_data:
  28.             return
  29.         return ContentFile(decoded_data, name=file_name)
  30.  
  31.  
  32. class DefaultBase64ImageConverter(LazyObject):
  33.     def _setup(self):
  34.         self._wrapped = Base64ImageConverter()
  35.  
  36.  
  37. default_base64_file_converter = DefaultBase64ImageConverter()
  38.  
  39.  
  40. # shared/rest/fields.py
  41. from django.utils.translation import ugettext_lazy as _
  42.  
  43. from rest_framework.serializers import FileField, ImageField
  44.  
  45. from ..models.utils import default_base64_file_converter
  46.  
  47.  
  48. class Base64FileFieldMixin:
  49.     message = None
  50.  
  51.     def __init__(self, message=None, **kwargs):
  52.         super().__init__(**kwargs)
  53.         if message:
  54.             self.message = message
  55.  
  56.     def to_internal_value(self, data):
  57.         try:
  58.             data = default_base64_file_converter.convert(data)
  59.         except Exception as ex:
  60.             self.fail(self.message)
  61.         return super().to_internal_value(data)
  62.  
  63.  
  64. class Base64FileSerializerField(Base64FileFieldMixin, FileField):
  65.     message = _("Invalid file was passed")
  66.  
  67.  
  68. class Base64ImageSerializerField(Base64FileFieldMixin, ImageField):
  69.     message = _("Invalid image was passed")
  70.  
  71.  
Add Comment
Please, Sign In to add comment