Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何按请求上传图像:Python Django Rest框架_Python_Django_Django Rest Framework_Python Requests - Fatal编程技术网

如何按请求上传图像:Python Django Rest框架

如何按请求上传图像: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

我可以上传现场时间和员工,但无法将图像上传到考勤图片

型号

序列化程序

视图

请求

如果我用base64.encodebase64对f进行编码,序列化程序将允许request.data,但它将变成None,我无法解码它,如果我只是传递它而不编码,序列化程序将不允许


或者我应该使用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__')