如何按请求上传图像:Python Django Rest框架
我可以上传现场时间和员工,但无法将图像上传到考勤图片 型号 序列化程序 视图 请求 如果我用base64.encodebase64对f进行编码,序列化程序将允许request.data,但它将变成None,我无法解码它,如果我只是传递它而不编码,序列化程序将不允许如何按请求上传图像:Python Django Rest框架,python,django,django-rest-framework,python-requests,Python,Django,Django Rest Framework,Python Requests,我可以上传现场时间和员工,但无法将图像上传到考勤图片 型号 序列化程序 视图 请求 如果我用base64.encodebase64对f进行编码,序列化程序将允许request.data,但它将变成None,我无法解码它,如果我只是传递它而不编码,序列化程序将不允许 或者我应该使用FileUploadParser。您是否尝试使用FileUploadParser 最后,我找到了一些纠正此问题的代码。从 请求 序列化程序.py 什么意思是你不能破译它?你能告诉我们你的请求处理代码和发生了什么吗?@Al
或者我应该使用FileUploadParser。您是否尝试使用
FileUploadParser
最后,我找到了一些纠正此问题的代码。从 请求 序列化程序.py
什么意思是你不能破译它?你能告诉我们你的请求处理代码和发生了什么吗?@AlVaz如果使用base64.encodebase64{'employee':['25'],'attention_pic':['/9j/4AAQSkZJ…']}的话,结果是没有(我想它不会通过序列化程序)我接下来该怎么做?根据我的理解,“FileUploadParser”可以发送唯一的文件,无法发送数据(您可以在我的代码中看到我发送了两个数据,一个是ID,两个是文件)。所以我尝试了“MultiPartParser”,但它似乎不起作用(可能是我做错了什么)
class Attendance(models.Model):
time = models.DateTimeField(default=datetime.now, blank=True)
employee = models.ForeignKey(Employee, related_name='employees')
attendance_pic = models.ImageField(upload_to='attendance_pics',null = True)
class AttendanceSerializer(serializers.ModelSerializer):
class Meta:
model = Attendance
fields = '__all__'
class AttendanceList(APIView):
def get(self,request):
model = models.Attendance
attendances = model.objects.all()
serializer = AttendanceSerializer(attendances, many = True)
return Response(serializer.data)
def post(self,request):
now = timezone.now()
serializer = AttendanceSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
if serializer.is_valid():
serializer.save(time=now)
# print (serializer.validated_data)
# emp = serializer.validated_data.get("employee")
# obj = models.Attendance.objects.create(time=now, employee=emp)
return Response("Success", status=status.HTTP_201_CREATED)
# return Response(AttendanceSerializer(obj).data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
f = open("pic.jpg","rb")
r = requests.post(self.url,data={"employee":ID,"attendace_pic":f})
f = open("pic.jpg","rb")
data = f.read()
data_url = "data:image/jpg;base64,%s" % base64.b64encode(data)
data_url = data_url[0:22] + data_url[24:]
print(data_url[0:50])
r = requests.post(self.url,data={"employee":ID, "attendance_pic":data_url})
f.close()
from rest_framework import serializers
from .models import Attendance
from django.core.files.base import ContentFile
import base64
class Base64ImageField(serializers.ImageField):
def to_internal_value(self, data):
from django.core.files.base import ContentFile
import base64
import six
import uuid
print("ininternal")
# Check if this is a base64 string
if isinstance(data, six.string_types):
# Check if the base64 string is in the "data:" format
print("ininstance")
if 'data:' in data and ';base64,' in data:
# Break out the header from the base64 content
header, data = data.split(';base64,')
# Try to decode the file. Return validation error if it fails.
try:
decoded_file = base64.b64decode(data)
except TypeError:
self.fail('invalid_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)
complete_file_name = "%s.%s" % (file_name, file_extension, )
data = ContentFile(decoded_file, name=complete_file_name)
return super(Base64ImageField, self).to_internal_value(data)
def get_file_extension(self, file_name, decoded_file):
import imghdr
extension = imghdr.what(file_name, decoded_file)
extension = "jpg" if extension == "jpeg" else extension
return extension
class AttendanceSerializer(serializers.ModelSerializer):
attendance_pic = Base64ImageField(
max_length=None, use_url=True,
)
class Meta:
model = Attendance
fields = ('__all__')