Nano Hash - криптовалюты, майнинг, программирование

Как я могу вернуть URL-адрес загрузки изображения, загруженного в хранилище firebase

Я хочу загрузить изображение в firebase (который работает), затем вернуть URL-адрес загрузки изображения и сохранить его в виде строки.

Вот мой код:

uploadImage = async (uri, imageName) => {
    const response = await fetch(uri);
    const blob = await response.blob();

    firebase.storage().ref().child(imageName).put(blob)
      .then(snap => {
        return snap.ref.getDownloadURL();
      })
      .then(downloadURL => {
        return downloadURL;
      })
      .catch(error => {
        console.log(`An error occurred while uploading the file.\n\n${error}`);
      });
  }

Изображение загружается в хранилище firebase. На данный момент он просто показывает это, когда я пытаюсь записать URL-адрес загруженного изображения в базу данных: https://ibb.co/WHHHxBY

Вот блок кода, в котором я создаю запись пользователя:

  firebase
    .auth()
    .createUserWithEmailAndPassword(this.state.email, this.state.password)
    .then(userCredentials => {
      let imageUrl = '';

      let db = firebase.database().ref('users/' + userCredentials.user.uid);

      if (this.state.image) {
        imageUrl = this.uploadImage(this.state.image.uri, `images/user-${userCredentials.user.uid}`);
      }

      db.set({
        email: this.state.email,
        imageUrl: imageUrl,
        username: this.state.username
      });

      return userCredentials.user.updateProfile({
        displayName: this.state.username
      });
    })
    .catch(error => this.setState({ errorMessage: error.message }));

  • когда я пытаюсь записать это в базу данных - ›как вы пишете в БД? Можете поделиться соответствующим кодом? 03.11.2019
  • Я написал ответ, см. Ниже. Однако я не понимаю, как вы можете получить результат, показанный на вашем изображении, ibb.co/WHHHxBY с помощью вашего кода. : как получить два подузла _40 и _65? Они были там раньше? 03.11.2019

Ответы:


1

В своей функции uploadImage вы связываете обещания, но не возвращаете цепочку. Вам следует адаптировать его следующим образом:

uploadImage = async (uri, imageName) => {
    const response = await fetch(uri);
    const blob = await response.blob();

    return firebase.storage().ref().child(imageName).put(blob)  // <-- Here return the chain
      .then(snap => {
        return snap.ref.getDownloadURL();
      })
      .then(downloadURL => {
        return downloadURL;
      })
      .catch(error => {
        console.log(`An error occurred while uploading the file.\n\n${error}`);
      });
  }

Однако вы можете преобразовать этот код в async/await "стиль" следующим образом:

uploadImage = async (uri, imageName) => {

    try {
        const response = await fetch(uri);
        const blob = await response.blob();

        const snap = await firebase.storage().ref().child(imageName).put(blob);

        const downloadURL = await snap.ref.getDownloadURL();

        return downloadURL;

    } catch (e) {
        console.error(e);
        throw e;
    }

}

Затем, поскольку эта uploadImage функция асинхронна, вам следует изменить способ ее вызова. Я предлагаю изменить другую часть вашего кода следующим образом:

try {
     const userCredentials = await firebase
        .auth()
        .createUserWithEmailAndPassword(this.state.email, this.state.password);

     let imageUrl = '';

     const db = firebase.database().ref('users/' + userCredentials.user.uid);

     if (this.state.image) {

        imageUrl = await this.uploadImage(this.state.image.uri, `images/user-${userCredentials.user.uid}`);

        await db.set({
            email: this.state.email,
            imageUrl: imageUrl,
            username: this.state.username
          });


          return userCredentials.user.updateProfile({
            displayName: this.state.username
          });

     }
     //You should probably manage the else case

} catch (e) {
     this.setState({ errorMessage: e.message })
}
03.11.2019
  • Привет, я скопировал это решение, но оно по-прежнему создает подузлы _40 и _65. Не знаю, почему это происходит. Может быть, он изначально не возвращает правильные данные? 03.11.2019
  • Можете ли вы в консоль записать значение downloadURL? Что вы получаете? 03.11.2019
  • См. Также обновление ответа, которое представляет собой адаптацию кода, используемого для создания записи пользователя. 03.11.2019
  • К вашему сведению, я только что перепробовал весь код своего ответа, и он работает правильно. В частности, нет _40 и _65subnodes, но правильный downloadUrl! 03.11.2019
  • Регистрация URL-адреса показала правильный, но все еще не записала правильное значение в базу данных. После обновления другой части моего кода, как вы показали, проблема была решена. Приносим извинения за поздний ответ и благодарим вас за улучшение качества моего кода и решение моих проблем! 03.11.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..