Мне не удалось найти руководства по работе с этой версией после версии 0.60, поэтому я написал свой собственный

Недавно я работал над несколькими проектами React Native, и одной из основных проблем, с которыми я столкнулся, было отсутствие поддержки библиотеки в версиях RN 0.60+ для загрузки изображений в сегменты AWS S3.

react-native-s3 и react-native-s3-upload - это библиотеки, которые я ранее использовал в своих проектах RN. Но поскольку версия RN выходит за рамки 0.60, я не мог использовать эти библиотеки. Однако я нашел способ загружать свои изображения в корзину AWS S3 с помощью библиотеки aws-sdk.

В этом примере мы будем использовать aws-sdk и react-native-image-picker.

Во-первых, вам необходимо установить в свой проект следующие библиотеки, используя npm или yarn. Вот ссылки на каждый из них на npm:

npm i aws-sdk
npm i react-native-image-picker
npm i base64-arraybuffer
npm i react-native-fs

Затем вам нужно создать учетную запись AWS IAM и корзину S3, используя свою учетную запись AWS. Если вы не знаете, как создать пользователя IAM, обратитесь к этой статье. Единственные изменения, которые вам нужно сделать, - это назначить программный доступ вашему пользователю и установить разрешение AmazonS3FullAccess. Не забудьте сохранить идентификатор ключа доступа и секретный ключ доступа для потом.

Кроме того, вы можете просто выбрать сервис s3 в консоли AWS и создать корзину s3. Снимите флажок «Блокировать весь общий доступ» , чтобы сделать корзину общедоступной.

После создания корзины добавьте следующую политику в качестве политики корзины:

{
      “Version”: “2008–10–17”,
      “Statement”: 
              [
                 {
                   “Sid”: “AllowPublicRead”,
                   “Effect”: “Allow”,
                   “Principal”: 
                              {
                               “AWS”: “*”
                              },
                   “Action”: “s3:GetObject”,
                   “Resource”: “arn:aws:s3:::<bucket_name>/*”
                 }
               ]
}

Затем нам нужно реализовать метод выбора изображений из галереи или снятия с камеры с помощью встроенного средства выбора изображений React:

const chooseImage = async () => {
   
   let options = {
     title: ‘Upload Prescription’,
     takePhotoButtonTitle: ‘Take a Photo’,
     chooseFromLibraryButtonTitle: ‘Select From Gallery’,
     storageOptions: {
       skipBackup: true,
       path: ‘images’,
     },
   };
ImagePicker.showImagePicker(options, async (response) => {
   if (response.didCancel) {
     console.log(‘User cancelled image picker’);
   } else if (response.error) {
     console.log(‘ImagePicker Error: ‘, response.error);
   } else if (response.customButton) {
     console.log(‘User tapped custom button: ‘, response.customButton);
     alert(response.customButton);
   } else {
     const file = {
        uri: response.uri,
        name: response.fileName,
        type: ‘image/jpeg’,
     };
     uploadImageOnS3(file);
   }
});
};

В приведенном выше примере я включил только параметры Upload from the gallery и Take from Camera. Вы можете найти множество пользовательских опций в документации.

Теперь мы можем реализовать метод загрузки изображений:

const uploadImageOnS3 = async (file) => {
   const s3bucket = new S3({
     accessKeyId: <ACCESS_KEY_ID>,
     secretAccessKey: <SECRET_ACCESS_KEY>,
     Bucket: <BUCKET_NAME>,
     signatureVersion: 'v4',
   });
let contentType = 'image/jpeg';
   let contentDeposition = 'inline;filename="' + file.name + '"';
   const base64 = await fs.readFile(file.uri, 'base64');
   const arrayBuffer = decode(base64);
s3bucket.createBucket(() => {
     const params = {
       Bucket: <BUCKET_NAME>,
       Key: file.name,
       Body: arrayBuffer,
       ContentDisposition: contentDeposition,
       ContentType: contentType,
   };
s3bucket.upload(params, (err, data) => {
     if (err) {
       console.log('error in callback');
     }
   console.log('success');
   console.log("Respomse URL : "+ data.Location);
   });
 });
};

Здесь я преобразовал файл изображения в базу 64, используя файловый поток, а затем в буфер массива, потому что aws-sdk поддерживает несколько типов данных, таких как строки и буферы массивов, которые должны быть загружены с использованием этого.

Этот пример должен помочь вам упростить разработку функций загрузки изображений в проектах версии RN 0.60+.



Учить больше