Как отправить изображение из 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"}]]}
Я был бы очень признателен за помощь, поскольку не могу разобраться в этом до конца.