在 Firebase v9 错误中使用 uploadString 监控上传

Posted

技术标签:

【中文标题】在 Firebase v9 错误中使用 uploadString 监控上传【英文标题】:Monitoring upload using uploadString in Firebase v9 error 【发布时间】:2021-12-08 12:53:35 【问题描述】:

从 Firebase 8 升级到 9 时,我遇到了一个问题。我需要监控 uploadString 的上传进度,但 uploadTask.on 似乎失败了。

var uploadTask = uploadString(ref(this.$storage, 'profile.jpg'), canvas.toDataURL('image/jpeg', 0.8), 'data_url');

uploadTask.on('state_changed', 
  (snapshot) => 
    const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
    console.log('Upload is ' + progress + '% done');
  , 
  (error) => 
    // Handle unsuccessful uploads
  , 
  () => 
    // Handle successful uploads on complete
  
);

图片已上传,但出现以下错误:

“TypeError:uploadTask.on 不是函数”

uploadTask.on 和版本 8 中的 putString 可以正常工作。有谁知道发生了什么?提前致谢。

【问题讨论】:

【参考方案1】:

我为任何感兴趣的人找到了一种解决方法,它专门适用于画布元素并使用 uploadBytesResumable 代替。如果有人知道的话,仍然对如何使用 uploadString 实现这一点感兴趣。

var img = canvas.toDataURL('image/jpeg', 0.8);
var file = now.dataURItoBlob(img);
var uploadTask = uploadBytesResumable(ref(now.$storage, 'profile.jpg'), file);

uploadTask.on('state_changed', 
  (snapshot) => 
    const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
    console.log('Upload is ' + progress + '% done');
  , 
  (error) => 
    // Handle unsuccessful uploads
  , 
  () => 
    // Handle successful uploads on complete
  
);

dataURItoBlob函数如下

dataURItoBlob(dataURI) 
    var byteString;
    if (dataURI.split(',')[0].indexOf('base64') >= 0)
        byteString = atob(dataURI.split(',')[1]);
    
    else
        byteString = unescape(dataURI.split(',')[1]);
    
    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
    var ia = new Uint8Array(byteString.length);
    for (var i = 0; i < byteString.length; i++) 
        ia[i] = byteString.charCodeAt(i);
    
    return new Blob([ia], type:mimeString);

【讨论】:

【参考方案2】:

uploadString()返回一个uploadTask。你用它来监控你的上传状态

【讨论】:

以上是关于在 Firebase v9 错误中使用 uploadString 监控上传的主要内容,如果未能解决你的问题,请参考以下文章

将图像从 ReactJS 上传到 Firebase v9 存储

Firebase Modular SDK V9.0.0+ TypeError:无法读取未定义 Firebase 的属性“应用程序”

列出 Firebase 存储 v9 中的所有文件

使用 Firebase v9 将文件从网站上传到 Firebase 存储

firebase模块的动态加载? (v9)

导入在 Firebase Client v9 (npm) 上不起作用