首页 > 解决方案 > 图片上传错误“检查表单上的编码类型。”

问题描述

在我的项目中,我需要上传一张图片作为我的玩家的头像,如我的models.py 所示:

class Player(models.Model):
    number = models.IntegerField()
    photo = models.ImageField(upload_to=upload_path, null=True, blank=True)
    firstname = models.CharField(max_length=24)
    lastname = models.CharField(max_length=24)
    tag = models.CharField(max_length=8, blank=True)
    color = models.CharField(max_length=10, null=True, blank=True)
    selected = models.BooleanField(null = False, blank=True)
    post = models.ForeignKey(Post, on_delete=models.SET_NULL, null=True)

    def __str__(self):
        return "#{}".format(
            self.number,
        )

我正在使用 Angular 来发送我的图像:

        <input
          type="file"
          (change)="onNewPlayerPhotoChanged($event)"
          accept="image/jpeg, image/png, image/jpg"
        />

& 在我的打字稿中

  onNewPlayerPhotoChanged(event) {
    this.newPlayerPhoto = event.target.files[0];
  }

然后在我的提交按钮上我得到了

  createPlayer() {
    this.newPlayer.selected = false;
    this.newPlayer.photo = this.newPlayerPhoto;
    this.newPlayer.post_id = parseInt(this.newPlayerPost, 10);
    this.playerService.create(this.newPlayer).subscribe(
      res => {
        this.getPlayerList();
        this.openNewModal = false;
        this.alertService.success('Joueur créé avec succès !');
        setTimeout(() => this.alertService.clear(), 2000);
      },
      error => {
        this.alertService.error(error);
        setTimeout(() => this.alertService.clear(), 2000);
      }
    );
  }

但我得到了错误:照片:[“提交的数据不是文件。检查表单上的编码类型。”]

这是我的 **views.py :**


class PlayerViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows Player to be viewed or edited.
    """

    parser_classes = [JSONParser]

    queryset = Player.objects.all()
    serializer_class = PlayerSerializer
    permission_classes = [IsAuthenticated, HasPermission, ]

    def post(self, request, *args, **kwargs):
        return HttpResponse({"message":request.FILES}, status=200)
        print(request.FILES)
        print(request.data)
        photo = request.FILES['photo']
        firstname = request.data['firstname']
        lastname = request.data['lastname']
        number = request.data['number']
        tag = request.data['tag']
        color = request.data['color']
        selected = request.data['selected']
        post = request.data['post']
        Player.objects.create(photo=photo, firstname=firstname, lastname=lastname, number=number, tag=tag, color=color,
                              selected=selected, post=post)
        return HttpResponse({'message':"Player created"}, status=200)

和我的serializers.py :

class PlayerSerializer(serializers.ModelSerializer):
    post = PostSerializer(many=False, read_only=True)
    post_id = serializers.PrimaryKeyRelatedField(source='post', write_only=True, queryset=Post.objects.all(),)

    class Meta:
        model = Player
        fields = '__all__'

我按照那个教程https://www.youtube.com/watch?v=-36YauTh4Ts但他没有遇到那个错误,

如果有人可以提供帮助,将不胜感激。谢谢 !

编辑:我尝试在我的视图中使用 FileUploadParser 和 MultiPartParser 作为解析器,但它们都不起作用,FileUploadParser 会返回一个错误,说需要文件名,MultiPartParser 会返回一个错误,说他正在接收 JSON。

标签: djangoangularimagedjango-rest-framework

解决方案


推荐阅读