#react-native #xmlhttprequest #expo #firebase-storage
#react-native #xmlhttprequest #expo #firebase-хранилище
Вопрос:
Я занимаюсь этой проблемой уже 3 дня. Вот в чем дело, в iOS я не могу прочитать файл с помощью XmlHttpRequest
. Мой код взят из firebase-storage-upload-example expo (ссылка). Я добавил этот код в свой app.json:
{
"expo": {
...somestuf
"ios": {
"infoPlist": {
"NSFaceIDUsageDescription": "This app uses the camera to scan barcodes on event tickets.",
"NSAppTransportSecurity": {
"NSAllowsArbitraryLoads": true
}
}
}
}
В Android все работает нормально. В iOS я думаю, что это проблема с разрешением, но я не уверен. Вот код и ошибка:
const blob = await new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.onload = () => {
resolve(xhr.response);
};
xhr.onerror = (e) => {
console.log(e);
updateStorageLoader({ error: e, loading: false });
reject(new TypeError('Network Request Failed!'));
};
xhr.responseType = 'blob';
xhr.open('GET', uri, true);
xhr.send(null);
});
Ошибка: Network Request Failed!
.
Как я могу это решить? FileSystem.readAsStringAsync(fileUri, options)
этот метод не подходит, потому что он не работает с загрузкой в хранилище firebase.
Редактировать: я думаю, что это не проблема с разрешениями. Я загрузил последний пример файла загрузки firebase expo, который отлично работает во вновь созданном управляемом приложении worklflow с конфигурацией 0. Так что я открыт для любого намека вместо прямого ответа. Просто, если бы вы могли указать на это, я был бы признателен.
Ответ №1:
Использование упомянутого здесь пакета Buffer работает как замена XMLHttpRequest при отправке в хранилище firebase.
Вот код, который я использовал для -firebase-storage-upload, работающий для 2-й и последующих загрузок
import { Buffer } from "buffer"; // get this via: npm install buffer
import * as FileSystem from "expo-file-system";
…
async function uploadImageAsync(uri) {
const options = { encoding: FileSystem.EncodingType.Base64 };
const base64Response = await FileSystem.readAsStringAsync(
uri,
options,
);
const blob = Buffer.from(base64Response, "base64");
const ref = firebase
.storage()
.ref()
.child(uuid.v4());
const snapshot = await ref.put(blob);
return await snapshot.ref.getDownloadURL();
}
Комментарии:
1. Добро пожаловать и спасибо за ваш ответ! Это работает для iOS, но на этот раз в Android он не загружает файлы или, точнее, файлы большего размера. Однако в Android, если я переключу эту реализацию, которую вы предоставляете, на запрос XHR, все работает отлично. Итак, вы знаете, почему это не работает для Android? Кроме того, знаете ли вы, почему мы получаем сетевую ошибку для XHR в iOS?
2. Похоже, что основная проблема связана с версией 0.63.2 для react-native и исправлена в 0.63.3. Подробнее о том, как expo исправляет выпуск 39, здесь forums.expo.io/t/blob-stopped-working-in-expo-sdk-39/43516/12
3. Большое спасибо за то, что поделились такой информацией.