#react-native #axios #form-data
Вопрос:
В моем проекте react native мне нужно иметь возможность отправлять изображения с помощью axios в API. Для этого у меня есть следующая функция:
export function SetImage(image, id, token)
{
const formData = new FormData();
formData.append('file',{
uri: image.uri,
type: image.type,
})
return axios({
method: 'PUT',
url: axios.defaults.baseURL "/api/SetImage/" ID,
headers: {
'Content-Type': 'multipart/form-data' ,
'Authorization': 'Bearer: ' token,
},
data: formData
})
}
Image — это возвращаемый объект, который я получил из ImagePicker.launchImageLibraryAsync
функции, которая выглядит примерно так:
{
"cancelled": false,
"height": 2048,
"type": "image",
"uri": "file:///data/user/0/host.exp.exponent/cache/<PathtoSomewhere>/ImagePicker/1d408e33-b54a-4189-
ac66-bd86ec11069a.jpg",
"width": 946,
}
Однако, когда я пытаюсь использовать функцию, я получаю следующую ошибку, которая мне ничего не говорит:
Network Error
at node_modulesaxioslibcorecreateError.js:16:14 in createError
at node_modulesaxioslibadaptersxhr.js:84:13 in handleError
- ... 9 more stack frames from framework internals
Комментарии:
1. Вы пытались загрузить изображение в клиент REST (например, Postman , Insomnia и т. Д.) И убедиться, что все работает?
2. да, я протестировал его в Postman, и он там работает
Ответ №1:
Недавно мне пришлось добавить ту же функциональность в свой проект (загрузить изображение по предварительно подписанному URL-адресу). Это то, что работает для меня:
const uploadImage = async ({ method, url, file }: any) => {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open(method, url);
xhr.setRequestHeader('Content-Type', file.type);
xhr.onload = () => {
if (xhr.status !== 200) {
reject(
new Error(
`Request failed. Status: ${xhr.status}. Content: ${xhr.responseText
}`,
),
);
}
resolve(xhr.responseText);
};
xhr.send(file);
});
};
// image === image inside local phone
export const uploadImageToUrl = async ({ image, url }: any) => {
await uploadImage({
method: 'PUT', url, file: {
uri: image.uri,
type: image.type,
}
});
return { url };
};
Чтобы загрузить изображение, вам просто нужно вызвать его как:
uploadImageToUrl({ url: your-upload-url, image: your-image-object-from-image-picker })
Примечание: передайте функции весь объект изображения (а не только uri)
Также добавьте эту строку, если необходимо:
xhr.setRequestHeader('Authorization', 'Bearer ' jwtoken);