Как отправить изображение из Expo Image Picker в Django REST с помощью axios

Я потратил на это около недели и не могу понять, что происходит.

Мне нужно загрузить изображения из React-Native (EXPO) в Django REST. Кажется, что axios отправляет объект вместо изображения (я думаю).

<
  const pickImage = async () => {
    // No permissions request is necessary for launching the image library
    let result = await ImagePicker.launchImageLibraryAsync({
      mediaTypes: ImagePicker.MediaTypeOptions.All,
      allowsEditing: true,
      aspect: [4, 3],
      quality: 1,
    });

    if (!result.cancelled) {
      const formData = new FormData();
      formData.append("image", {
        uri: result.uri,
        name: "image.jpeg",
        type: "image/jpeg",
      });
      try {
        const response = await axiosInstance({
          method: "post",
          url: `/api/businesses/84/upload_image/`,
          data: formData,
          headers: {
            "Content-Type": "multipart/form-data" },
        })
        console.log(response.data);
      } catch (error) {
        console.log(error.response.data);
      }
    }
  };

Django API:

class BusinessProfileViewSet(MixedPermissionModelViewSet):
    """
    API endpoint that allows business profiles to be viewed, created, or edited.
    """
    queryset = BusinessProfile.objects.all().order_by('-created_on')
    serializer_class = BusinessProfileSerializer
    permission_classes_by_action = {
        'list': [IsOwnerOrStaff],
        'create': [AllowAny],
        'update': [IsOwnerOrStaff],
        'retrieve': [IsOwnerOrStaff],
        'partial_update': [IsOwnerOrStaff],
        'destroy': [IsAdminUser]
    }
    paginator = None
    parser_classes = [MultiPartParser, FormParser]

    @action(methods=['post'], detail=True, permission_classes=[IsAuthenticated])
    def upload_image(self, request, pk=None):
        try:
            print(request.data)
            image = request.data['file']
        except KeyError:
            raise KeyError('Request has no image attached')
        business_profile = BusinessProfile.objects.get(user=request.user)
        business_profile.image = image
        business_profile.save()
        return Response(status=200)

В его точке request.data печатается <QueryDict: {}>.

Если я изменю парсер на Django на:

parser_classes = [FileUploadParser]

И заголовки к:

          headers: { 
            "Content-Disposition": "attachment; filename=helloworld.jpeg",
            "Content-Type": "multipart/form-data",
          }

Тогда request.data печатает {'file': <InMemoryUploadedFile: helloworld.jpeg (multipart/form-data)>}

Но я не могу получить реальный ФАЙЛ на сервере!

Если я сохраняю файл без расширения .jpeg, то получаю что-то вроде:

{"_parts":[["image",{"uri":"file:///Users/david/Library/Developer/CoreSimulator/Devices/6BD14916-FAC9-4574-92D2-D48B38C9CCE3/data/Containers/Data/Application/D5F1168A-6C80-468A-BF3C-1BA4A7212FC2/Library/Caches/ExponentExperienceData/%2540digibrainllc%252FDigiFocus/ImagePicker/6D298108-FB31-4D83-9D3E-09499A0D743B.jpg","name":"image.jpeg","type":"image/jpeg"}]]}

Я был бы очень признателен за помощь, поскольку не могу разобраться в этом до конца.

Вернуться на верх