Error Uploading Image Using Postman In Django Rest Framework
I'm trying to create an endpoint to upload images(using postman) to a specific folder using django rest framework. This is my settings for the folder, MEDIA_URL = '/media/' MEDIA_R
Solution 1:
You are using serializer = UserMediaSerializer(request.data)
but you should call it by serializer = UserMediaSerializer(data=request.data)
For uploading images in Django rest framework you should either upload images on S3 and pass s3 url in DRF API or use base64 field in serializer and send base64 encoded value of image in API
import uuid
import base64
import imghdr
from django.utils.translation import ugettext_lazy as _
from django.core.files.base import ContentFile
from rest_framework import serializers
ALLOWED_IMAGE_TYPES = (
"jpeg",
"jpg",
"png",
"gif"
)
classBase64ImageField(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.
"""defto_internal_value(self, base64_data):
# Check if this is a base64 stringifnot base64_data:
returnNoneifisinstance(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 characters are more than enough.# Get the file name extension:
file_extension = self.get_file_extension(file_name, decoded_file)
if file_extension notin 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)
returnsuper(Base64ImageField, self).to_internal_value(data)
raise serializers.ValidationError('This is not an base64 string')
defto_representation(self, value):
# Return url including domain name.return value.name
defget_file_extension(self, filename, decoded_file):
extension = imghdr.what(filename, decoded_file)
extension = "jpg"if extension == "jpeg"else extension
return extension
Updated
You should use ImageField (not FileField) for images.
You can use above field directly in serializer like any other field.
classUserMediaSerializer(serializers.ModelSerializer):
profile_image_web = Base64ImageField(required=False)
classMeta:
model = models.UserMediafields= ('profile_image_web', 'profile_image_ios', 'profile_image_android', 'thumbnail')
Post a Comment for "Error Uploading Image Using Postman In Django Rest Framework"