Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import base64, imghdr, uuid
- from django.core.files.base import ContentFile
- from django.utils.translation import ugettext_lazy as _
- from rest_framework import serializers
- DEFAULT_CONTENT_TYPE = "application/octet-stream"
- ALLOWED_IMAGE_TYPES = (
- "jpeg",
- "jpg",
- "png"
- )
- class Base64ImageField(serializers.ImageField):
- """
- A django-rest-framework field for handling image-uploads through raw post data.
- It uses base64 for en-/decoding the contents of the file.
- """
- def from_native(self, base64_data):
- # Check if this is a base64 string
- if isinstance(base64_data, basestring):
- # Try to decode the file. Return validation error if it fails.
- try:
- decoded_file = base64.b64decode(base64_data)
- except TypeError:
- raise serializers.ValidationError(_("Please upload a valid image."))
- # Generate file name:
- file_name = str(uuid.uuid4())[:12] # 12 character is more than enough.
- # Get the file name extension:
- file_extension = self.get_file_extension(file_name, decoded_file)
- if file_extension not in ALLOWED_IMAGE_TYPES:
- raise serializers.ValidationError(_("The type of the image couldn't been determined."))
- complete_file_name = file_name + "." + file_extension
- data = ContentFile(decoded_file, name=complete_file_name)
- return super(Base64ImageField, self).from_native(data)
- def get_file_extension(self, filename, decoded_file):
- extension = imghdr.what(filename, decoded_file)
- extension = "jpg" if extension == "jpeg" else extension
- return extension
Advertisement
Add Comment
Please, Sign In to add comment