मुझे अपने कोणीय एप्लिकेशन से फायरबेस स्टोरेज पर फ़ाइल अपलोड करने का प्रयास करने में कुछ कठिनाइयां आ रही हैं।

मेरे पास निम्न स्थिति है: एक सेवा वर्ग में मेरे पास ऐसा कुछ है:

if(file != null) {
    this.uploadFileIntoFirebaseStore(file)
        .subscribe(url => {
                              console.log("RETRIEVING URL")
                              console.log(url);
                              console.log("END RETRIEVING URL");
                              ...................................
                              ...................................
                              OTHER OPERATIONS
                              ...................................
                              ...................................
                           });
}

जैसा कि आप पिछले कोड स्निपेट में देख सकते हैं, मैं uploadFileIntoFirebaseStore() नामक एक विधि को कॉल कर रहा हूं और इसमें एक फाइल पास कर रहा हूं और मैं लौटाए गए अवलोकन योग्य की सदस्यता ले रहा हूं। इस विधि को फायरबेस स्टोरेज में एक फाइल अपलोड करनी है और मुझे लगता है कि इसका कार्यान्वयन पूरी तरह से सही नहीं है।

यह मेरी uploadFileIntoFirebaseStore() विधि का कोड है:

uploadFileIntoFirebaseStore(fileToBeUploaded) {
    var n = Date.now();
    const filePath = `user_avatar/${n}`;
    const fileRef = this.storage.ref(filePath);

    return this.storage.upload(`user_avatar/${n}`, fileToBeUploaded)
             .snapshotChanges()
             .pipe(
                switchMap(refStatus => {
                  console.log("refStatus: ", refStatus);

                  if(refStatus.state == "running")
                    console.log("UPLOAD RUNNING");
                  else {
                    console.log("UPLOAD COMPLETED");
                    console.log("fileRef.getDownloadURL() OUTPUT: ", fileRef.getDownloadURL());
                    //return fileRef.getDownloadURL();
                  }

                  console.log("fileRef.getDownloadURL() OUTPUT: ", fileRef.getDownloadURL());
                  return fileRef.getDownloadURL();
                })
             );
}

समस्या निम्न है: यह विधि मेरी फ़ाइल को फायरबेस स्टोरेज में सही ढंग से अपलोड करती है। यह सबसे पहले में प्रवेश करता है

if (refStatus.state == "running")

यह दर्शाता है कि अपलोड प्रक्रिया अभी भी पूरी नहीं हुई है। इस बिंदु पर यह return fileRef.getDownloadURL(); देखा जा सकता है लेकिन यह (इस समय) एक ऐसी फ़ाइल को संदर्भित करता है जो अभी तक पूरी तरह से अपलोड नहीं हुई है (इसलिए अभी तक कोई URL मौजूद नहीं है)।

तो मेरी uploadFileIntoFirebaseStore() विधि की सदस्यता यूआरएल को पुनः प्राप्त करने और प्रिंट करने के लिए इस अवलोकन योग्य का उपयोग करने का प्रयास करती है (जिसे console.log(url); द्वारा मुद्रित किया जाना है) और मुझे एक त्रुटि मिलती है।

फिर अपलोड प्रक्रिया तब तक जारी रहती है जब तक कि यह else स्टेटमेंट में प्रवेश नहीं कर लेता है जो अपलोड की गई फ़ाइल के URL को प्रिंट करता है। लेकिन इस बिंदु पर मेरा आवेदन टूट गया है क्योंकि ऐसा लगता है कि uploadFileIntoFirebaseStore() सदस्यता में मुझे अभी तक एक मूल्य प्राप्त हुआ है जिसमें यूआरएल शामिल नहीं है।

मैं वास्तव में नहीं जानता कि इस मुद्दे को कैसे हल किया जाए। मेरा विचार यह है कि uploadFileIntoFirebaseStore() विधि को केवल तभी एक मान उत्सर्जित करना होता है जब फ़ाइल पूरी तरह से अपलोड हो जाती है और इस फ़ाइल के लिए एक यूआरएल मौजूद होता है।

कैसे मैं इस मुद्दे को हल कर सकता हूँ?

0
AndreaNobili 24 अक्टूबर 2020, 21:04

2 जवाब

सबसे बढ़िया उत्तर

मुझे लगता है कि आपको फ़िल्टर ऑपरेटर की आवश्यकता है। यह तभी जारी रहेगा जब आपकी हालत बीत जाएगी।

...
.pipe(
    filter(refStatus => refStatus.state != "running"),
    switchMap(refStatus => {
        ...
1
Gilsdav 24 अक्टूबर 2020, 22:14

ऐसा लगता है कि आप अपने अंतिम उत्सर्जन में 'चल रही' स्थिति को अनदेखा कर सकते हैं। मैं कुछ इस तरह की कोशिश करूंगा:

uploadFileIntoFirebaseStore(fileToBeUploaded) {
  var n = Date.now();
  const filePath = `user_avatar/${n}`;
  const fileRef = this.storage.ref(filePath);

  return this.storage.upload(filePath, fileToBeUploaded)
    .snapshotChanges()
    .pipe(
      tap(refStatus => {
        if(refStatus.state == "running"){
          console.log("UPLOAD RUNNING");
        }
      }),
      filter(refStatus => refStatus.state != "running"),
      switchMap(_ => fileRef.getDownloadURL())
    );
}
1
Mrk Sef 27 अक्टूबर 2020, 18:06