Как загрузить файл изображения в firebase

var storageRef = firebase.storage().ref('images');
let uuid = uuidv1();
var uploadTask = storageRef.child(`${uuid}`).putString(imageUrl, 'base64', {contentType:'image/jpg'});

Код будет генерировать привязанный ко времени UUID в качестве имени файла, а imageUrl - это файл изображения base64, загруженный пользователями. Я использую react-native-photo-upload для написания функции загрузки. Затем в firebase я получил такой файл: изображение

Само изображение составляет 23,4 КБ, но то, что я получил в firebase, намного больше. Как я могу получить образ файлового типа с react-native-photo-upload? onPhotoSelect возвращает только изображение base64.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
1 456
3

Ответы 3

Вам не нужно добавлять data:image/jpeg;base64, если это URL-адрес изображения. Вы можете просто использовать <Image source = {{uri: image_url}} />

Я пробовал оба, но они не работают. Файл, который я загрузил в firebase, не является изображением (его нельзя открыть, если я его загрузю). Вот и думаю, как получить файл через подборщик изображений.

Caitlin Wen 20.04.2018 23:01

Не думаю, что Imagepicker здесь поможет. DownloadUrl должен иметь возможность правильно загружаться и открываться. Разве это не так?

agenthunt 20.04.2018 23:34

Проблема в этой части кода:

return (<Image source = {{ uri: "data:image/jpeg;base64," + image_url }} />)

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

Во-первых, локальное изображение (т.е. в папке вашего проекта):

<Image source = {require('...')} />

Во-вторых, данные изображения (т.е. данные base64, где у вас уже есть данные)

<Image source = {{ uri: 'data:image/jpg;base64,vncowi342r27yvb...' }} />

В-третьих, локальные изображения на телефонах пользователей

<Image source = {{ uri: 'file://...' }} />

В-четвертых, удаленное изображение (т. Е. URL-адрес загрузки)

<Image source = {{ url: 'https://...' }} />

Способ рендеринга изображения не соответствует ни одному из шаблонов, потому что для 2 у вас уже должны быть данные для рендеринга изображения. Итак, вот 2 способа решения проблемы

Метод 1. Если вы не хотите менять способ загрузки изображения (чего я не рекомендую, просто потому, что для вас гораздо больше работы, вы поймете почему), тогда у вас должно быть состояние под названием imageData, которое удерживает данные base64 изображения, которое вы хотите визуализировать, затем передайте им данные, как только вы загрузили их из firebase следующим образом:

state = {
    imageData: '',
    ...
    ...
}

componentDidMount() {
    fetchImage()
}

fetchImage() {
    var gsReference = storage.refFromURL('gs://SOME_ADDRESS')
    gsReference.getDownloadURL()
        .then((url) => { return fetch(url) })    // Use react native's fetch API
        .then((response) => { return response.json() })
        .then((data) => this.setState({ imageData: data }))
}

render() {
    const { imageData } = this.state

    return (
        <View>
            {imageData !== '' && <Image
                source = {{ uri: 'data:image/jpeg;base64,' + imageData }}
            />}
        </View>
    )
}

Метод 2. Загрузите изображение в виде большого двоичного объекта с модулем react-native-fetch-blob.

import RNFetchBlob from 'react-native-fetch-blob';    

const Blob = RNFetchBlob.polyfill.Blob;
const fs = RNFetchBlob.fs;
window.XMLHttpRequest = RNFetchBlob.polyfill.XMLHttpRequest;
window.Blob = Blob;

// Upload method
// 'path' is the path of the image you want to upload, for example, it
// could look like this: 'file://...', i.e. an image picked from user's phone
function uploadImage(path) {
    let imageFile = RNFetchBlob.wrap(path);
    const imageRef = firebase.storage().ref('.../.../.../')
    let uploadBlob = null

    Blob.build(imageFile, { type: 'image/jpg' })
        .then((imageBlob) => {
            uploadBlob = imageBlob;
            return imageRef.put(imageBlob, { contentType: 'image/jpg' });
        })
        .then(() => {
            uploadBlob.close();
            return imageRef.getDownloadUrl()
        })
        .then((url) => {
            // Do something with the url, e.g. store it in database
        })
        .catch(() => { ... });
}

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

<Image source = {{ uri: '<url>' }} />

Будь хорошим другом и прими мой ответ, пожалуйста :) И каким методом ты воспользовался?

K.Wu 21.04.2018 00:18

Шаг 1: инициализировать настройку хранилища firebase

Шаг 2: следовать этому коду

handleSubmit = (imageFile) => {
const imageUpload = storage.ref(`images/${imageFile.name}`).put(imageFile);
imageUpload.on(
  'state_changed',
  (snapshot) => {
    //process fun here  
      console.info(snapshot);
    }
  },
  (error) => {
     //error fun here 
      console.info(error);       
    }
  },
  () => {
    storage
      .ref('images')
      .child(imageFile.name)
      .getDownloadURL()
      .then((url) => {
        console.info(url);            
      });
    }
   );
 };

return url - это URL нашего изображения

Другие вопросы по теме