получить строку getDownloadURL () из хранилища Firebase - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь получить URL, который должен вернуть getDownloadURL ().Однако на самом деле он возвращает мне данные типа this .

Мне удалось отобразить их в формате HTML, однако моя настоящая цель - получить URL, который можно увидеть на изображении.Я написал, чтобы я мог получить его и сохранить в моей базе данных Firestore.Однако я не знаю, как получить это значение.Это мой фрагмент:

    getImgFromServer(imgName: string): string {
    let img;
    let downloadIMG;
    img = firebase.storage().ref("/imgs/" + imgName).getDownloadURL();
    let ref= firebase.storage().ref();
    const imgRef = ref.child("/imgs/" + imgName);
    imgRef.getDownloadURL().then(function(url){
      downloadIMG=url;
      img = downloadIMG;
      console.log("MY URL " + downloadIMG)

    })
    console.log("img")
    console.log(img)
    return img
  }

При отладке этого журнала этот код печатает URL-адрес, который я хочу использовать:

console.log("MY URL " + downloadIMG)

МОЙ URL https://firebasestorage.googleapis.com/v0/b/static-epigram-189720.appspot.com/o/imgs%2Fmovie-1543700476524.jpg?alt=media&token=5550a552-1ed0-488e-beed-a6bc82791293

Однако, этот распечатывает данные из изображения :

console.log(img)

Я хотел бы вернуть URL-адрес один, чтобы я мог его использовать.

РЕДАКТИРОВАТЬ

Теперь, когда я получаю URL-адрес, я хотел бы сохранить его в Cloud Firestore, чтобы я мог использовать URL-адрес в HTML, чтобы показать картинку.Это функция, которая хранит имя изображения:

createPublic(id,img){
this.firestore.doc(`public/${id}`).set({
     img,
    });
}

С ответом, данным Фрэнком, теперь я могу получить URL-адрес, поэтому я просто использую его для получения URL-адреса и со следующей функцией:обновите только что загруженный документ.

    async updateImg(img,idPubli){
    const imgToUpdate= await this.imgServ.getImgFromServer(img);
    this.imgServ.updateImgFromServer(imgToUpdate,idPubli)
  }

     updateImgFromServer(image,id){
      this.firestore.doc(`public/${id}`).set({
        img:image,
      });
     }

Однако, похоже, он не работает.Я могу предположить, что это может быть связано с тем, что изображение или документ не были загружены до выполнения updateImg () , но я немного знаком с асинхронными функциями, поэтому мне не удается получить правильное решениесейчас.

В случае, если это поможет, это функции, в которые я загружаю изображение, и функция, которая его загружает.

 submit() {
    this.imgServ.uploadImage();
    this.viewCtrl.dismiss({data});
  }

После функции dismiss я собираю все данные и затем вызываю createPublic() функция.

 uploadImage() {
    this.image = 'movie-' + new Date().getTime() + '.jpg';
    let storageRef: any,
      parseUpload: any;
    return new Promise((resolve, reject) => {
      storageRef = firebase.storage().ref('imgs/' + this.image);
      parseUpload = storageRef.putString(this.cameraImage, 'data_url');


      parseUpload.on('state_changed', (_snapshot) => {
        // We could log the progress here IF necessary
        // console.log('snapshot progess ' + _snapshot);
      },
        (_err) => {
          reject(_err);
        },
        (success) => {
          resolve(parseUpload.snapshot);
        });
    });
  }

1 Ответ

0 голосов
/ 02 декабря 2018

Поскольку URL-адрес для загрузки создается при обращении к серверу, может пройти некоторое время, прежде чем он станет доступным.И вы не можете заставить код ждать, пока это значение станет доступным.Вот почему getDownloadURL() возвращает обещание, а затем вызывает его then() после получения URL-адреса для загрузки с сервера.Этот URL-адрес доступен только внутри обратного вызова, поскольку код после обратного вызова выполняется до того, как сервер вернул URL-адрес загрузки (и, следовательно, до вызова обратного вызова then()).

Один из распространенных подходов - просто передатьобещание вокруг, и используйте его then() всякий раз, когда вам нужно значение.Итак:

const imgRef = ref.child("/imgs/" + imgName);
const downloadUrl = imgRef.getDownloadURL();

...

downloadUrl.then(function(url){
  console.log("MY URL " + url)
})

Альтернативой в современных средах является использование новых ключевых слов async / await.Они оборачивают основанный на обещаниях подход выше в некотором синтаксическом сахаре:

async getImgFromServer(imgName: string): string {
    let img;
    let downloadIMG;
    img = firebase.storage().ref("/imgs/" + imgName).getDownloadURL();
    let ref= firebase.storage().ref();
    const imgRef = ref.child("/imgs/" + imgName);
    const downloadURL = await imgRef.getDownloadURL()
    return downloadURL
}

, который вы затем называете:

const downloadURL = await getImgFromServer("image name")

Также см .:

...