Я создаю приложение, используя React-Native и Expo. В таком приложении я использую сервисы AWS Amplify, Cognito, DynamoDB и S3. А именно, в настоящее время я пытаюсь поместить изображения с S3, используя этот API . Я использую эту функцию:
const storeFileInS3 = async (
fileUri,
awsKey = null,
access = "public"
) => {
const blob = await new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.onload = function() {
resolve(xhr.response);
};
xhr.onerror = function() {
reject(new TypeError("Network request failed"));
};
xhr.responseType = "blob";
xhr.open("GET", fileUri, true);
xhr.send(null);
});
const { name, type } = blob._data;
const options = {
level: access,
contentType: type,
};
const key = awsKey || name;
try {
const result = await Storage.put(key, blob, options);
return {
access,
key: result.key
};
} catch (err) {
throw err;
}
};
Вызывается так:
result2 = storeFileInS3(uri)
Это успешно, так как я могу видеть изображение в моей базе данных, успешно загружено. Однако при попытке получить доступ к изображению с помощью функции get :
const result5 = await Storage.get(key, {level: 'public', download: true})
я получаю «Возможный необработанный отказ от обещания» .... «Указанный ключ не существует».
Я сузил проблему до общего доступа к отдельным изображениям. Точное место в S3 В частности, если я щелкну «Все» и поставлю флажок «Читать объект» в разделе доступа к этому объекту, моя функция get не вернет ошибку.
Хотя, как видно из функции storeFileinS3, я поставил файл с общедоступным доступом, он по-прежнему имеет флажок, который я упомянул ранее, не отмеченным.
Есть ли способизменить разрешения всех отдельных объектов в общей папке таким образом, чтобы все объекты предоставляли доступ на чтение «каждому» посредством вызова из React-Native?
Я пытался изменить политику корзины, делаявсе ведро публично, но все равно не меняет этот флажок при загрузке. Я также попытался добавить поле ACL к опциям и установить для него значение «public-read», но ни одна попытка не сработала.