В моей предыдущей статье я объяснил, как получить несколько изображений с помощью react-native-image-crop-picker
, а в этом посте я расскажу, как загрузить эти изображения на сервер AWS S3.
Для этого я использовал react-native-aws3
, эта библиотека не имеет нативных зависимостей, поэтому я предпочел ее другим библиотекам.
Установить react-native-aws3
Пожалуйста, зайдите на их веб-сайт, чтобы установить и настроить политику IAM, как указано.
Кнопка загрузки и onPress
Теперь я создал простую кнопку, подобную этой
<Button
onPress={onUploadClick}
title="Upload"
/>
как react-native-aws3
загружать одно изображение на S3 за раз, но у меня есть несколько изображений для загрузки, поэтому я использовал Promise.all
.
const uploadButtonClick = () => {
let promises = [];
images.map((image, i) => {
promises.push(uploadImageToS3(image));
});
}
Здесь я создал пустой массив обещаний для хранения каждого ответа на вызов загрузки. Затем я сопоставляю массив изображений для загрузки вызовов с одним изображением, и promises.push
сохраняет этот ответ в массиве обещаний.
RNS3.put
Затем я определил свой uploadImageToS3
метод, подобный упомянутому в примере react-native-aws3
.
const uploadImageToS3 = async image => { const options = { keyPrefix: "uploads/", bucket: "your-bucket", region: "us-east-1", accessKey: "your-access-key", secretKey: "your-secret-key", successActionStatus: 201 } const file = { uri: `${image.path}`, name: image.path.substring(image.path.lastIndexOf('/') + 1), //extracting filename from image path type: image.mime, };
return new Promise((resolve, reject) => { RNS3.put(file, options) .then(res => { if (res.status === 201) { const {postResponse} = res.body; resolve({ src: postResponse.location, }); } else { console.log('error uploading to s3', res); } }) .catch(err => { console.log('error uploading to s3', err); reject(err); }); }); };
Этот метод возвращает обещание URL/местоположения изображения в виде объекта, имеющего значение src
.
Теперь я объединил все обещания с методом Promise.all
Promise.all(promises).then(uploadedImgs => {
console.log('Yayy, all images are uploaded successfully', uploadedImgs)
});
массив uploadedImgs будет выглядеть так
[
{
src: 'https://<image-url>'
},
{
src: 'https://<image-url>'
},
]
В приведенном выше коде я отображаю только консольное сообщение, но мне нужен этот массив изображений для отправки на другой вызов API. Таким образом, вы можете использовать этот массив в своем состоянии или отправить его в базу данных в соответствии с вашими потребностями.
На сегодня все, спасибо за прочтение!