putString() 中的 UploadTask 出现问题

Posted

技术标签:

【中文标题】putString() 中的 UploadTask 出现问题【英文标题】:Problem with the UploadTask from putString() 【发布时间】:2019-05-05 19:17:33 【问题描述】:

我在使用 Firebase 存储的 UploadTask 时遇到问题。 我正在尝试上传图像,然后将图像 URL 保存在 Firestore Cloud 上。为此,我有以下代码:

newuploadImage() 
    this.image = 'movie-' + new Date().getTime() + '.jpg';
    let storageRef: any,
    parseUpload: any;
    storageRef = firebase.storage().ref('imgs/' + this.image);
    parseUpload = storageRef.putString(this.cameraImage, 'data_url')
    parseUpload.on('state_changed',
    function (snapshot) 
    , function (error) 
    , function () 
        // Upload completed successfully, now we can get the download URL
        parseUpload.snapshot.ref.getDownloadURL().then(function (downloadURL) 
            const idPubli = this.firestore.createId();
            const idReto = this.firestore.createId();
            let IDUser = firebase.auth().currentUser.uid;
            let img = downloadURL
            const idPuntPubli = this.firestore.createId();
            let participacionCreadora = true;
            let punt = 0;
            this.firestore.doc(`public/$idPubli`).set(
                idPubli,
                idReto,
                IDUser,
                img,
                idPuntPubli,
                participacionCreadora,
                punt,
            )
        );
    )

图片上传正常,但是当它尝试执行 this.firestore 时,控制台日志给了我这个错误:

ERROR TypeError: Cannot read property 'firestore' of undefined

我不知道如何克服这个错误。

编辑

这是导入和构造函数,以防出现问题。

import   AngularFirestore from 'angularfire2/firestore';

constructor(public camera: Camera, public firestore: AngularFirestore) 
  

【问题讨论】:

你能分享你的构造函数吗?让我知道你在哪里初始化 firestore? 我已经用导入和构造函数编辑了这个问题。据我所知,它应该是正确的,因为我在其他文件上做了同样的事情并且它一直有效。 【参考方案1】:

分享我的代码,可能对你有帮助。

  this.imageFile.name.substr(this.imageFile.name.lastIndexOf('.'));
  const fileRef = this.storage.ref(this.filePath);
  this.task = this.storage.upload(this.filePath, this.imageFile);
  this.uploadPercent = this.task.percentageChanges();
  this.task
    .snapshotChanges()
    .pipe(
      finalize(() => 
        this.downloadURL = fileRef.getDownloadURL();
        this.downloadURL.subscribe(url => 
          this.imageUrl = url;
        );
      )
    )
    .subscribe();
  return this.uploadPercent;

【讨论】:

您能否添加一些解释此代码如何提供帮助?【参考方案2】:

您很可能遇到了范围问题,您可以通过替换此函数来解决:

.then(function (downloadURL)

带有箭头函数(保留词法范围)。

.then((downloadURL) =>

【讨论】:

现在我不是在 Firestore 上遇到问题,而是在任何 Firestore 功能上遇到问题。这是现在的错误:ERROR TypeError: Cannot read property 'createId' of undefined 你在哪里初始化this.firestore?它不在您的样本中。也许你还没有初始化它? 我已经编辑了问题,现在它具有构造函数和导入行。直到现在,我一直能够使用数据库。 @FernandoSanchezdeNieva - 你已经嵌套了function...,它们都可以转换为箭头函数。即 function (snapshot)function (error)function() 都应该更改以保留您的范围。 我真的不明白你要我做什么?你想让我把所有的,function(snapshot) ,function(error) , function () 改成:parseUpload.on('state_changed', (snapshot) =>)

以上是关于putString() 中的 UploadTask 出现问题的主要内容,如果未能解决你的问题,请参考以下文章

Flutter -> UploadTask 方法 OnComplete 不存在

iOS:didCompleteWithError、didReceive 响应未由 URLSession.uploadTask 触发

uploadTask 成功后,ref.downloadURL() 不执行或返回 url

使用 NSURLSession UploadTask 暂停、恢复、取消上传任务

Firebase 存储 putString 方法

如何从 Firebase Storage 获取下载网址?