Продолжая создавать наше Приложение React Native Social Poster, мы хотим, чтобы наши пользователи сделали снимок и загрузили его в Firebase Storage. React Native Image Picker идеально подходит для использования нативного интерфейса камеры телефона.
_takePicture = () => { const cam_options = { mediaType: 'photo', maxWidth: 1000, maxHeight: 1000, quality: 1, noData: true, }; ImagePicker.launchCamera(cam_options, (response) => { if (response.didCancel) { } else if (response.error) { } else { this.setState({ imagePath: response.uri, imageHeight: response.height, imageWidth: response.width, }) } }) }
Поскольку в React Native отсутствует реализация Blob, мы используем хорошо поддерживаемый пакет React Native Fetch Blob. Это позволяет нам создать Blob из локальной фотографии, чтобы мы могли легко загрузить его в Firebase Storage.
const Blob = RNFetchBlob.polyfill.Blob const fs = RNFetchBlob.fs window.XMLHttpRequest = RNFetchBlob.polyfill.XMLHttpRequest window.Blob = Blob const uploadImage = (uri, imageName, mime = 'image/jpg') => { return new Promise((resolve, reject) => { const uploadUri = Platform.OS === 'ios' ? uri.replace('file://', '') : uri let uploadBlob = null const imageRef = firebaseApp.storage().ref('posts').child(imageName) fs.readFile(uploadUri, 'base64') .then((data) => { return Blob.build(data, { type: `${mime};BASE64` }) }) .then((blob) => { uploadBlob = blob return imageRef.put(blob, { contentType: mime }) }) .then(() => { uploadBlob.close() return imageRef.getDownloadURL() }) .then((url) => { resolve(url) }) .catch((error) => { reject(error) }) }) }
Это решение очень хорошо работает с Firebase Javascript SDK 3.6.0, но новая версия 3.6.1 фактически нарушает работу storage.imageref.put (). Служба поддержки Firebase знает о проблеме и в настоящее время изучает ее. Будем надеяться, что они скоро найдут решение этой проблемы.
ОБНОВЛЕНИЕ 28 ноября 2016 г.
Команда поддержки Firebase ответила на эту проблему: Похоже, проблема связана с response-native-fetch-blob, в котором была ошибка, из-за которой он не работал должным образом с выпуском 3.6.1. Ошибка исправлена в версии v0.10.1-beta.1 с PR # 194. Самая последняя версия - v0.10.1-beta.2. См. Примечания к выпуску для получения более подробной информации.
Я обновился до новой бета-версии response-native-fetch-blob и последней версии Firebase 3.6.1 sdk и хорошие новости, все работает очень хорошо. Спасибо команде поддержки Firebase за их реакцию.
Не стесняйтесь клонировать наше Приложение Social Poster и изменять его по своему усмотрению.