React Native Firebase v9上传图像仅显示9个字节

cetgtptt  于 2023-04-07  发布在  React
关注(0)|答案(2)|浏览(159)

我正在使用react native和firebase(v9)上传图片到firebase。在firebase存储中,文件上传了,但大小只有9字节,所以它无法正常打开。我不知道如何解决这个问题:S

const uploadFiles = (file, name, storeKey) => {
    if(!file){
        console.log('no file exists')
        return;
    }
    const exe = file.substring(file.lastIndexOf('.'));
    const fileName = name + exe;
    const storageRef = ref(storage, `/files/${fileName}`);
    const uploadTask = uploadBytesResumable(storageRef, file);
    uploadTask.on('state_changed', null,
        (error) => {
            alert(error);
        },
        () => {
            getDownloadURL(uploadTask.snapshot.ref)
            .then((URL) => {
                setDoc(doc(db, 'Store', storeKey, 'coffeeDB', name), {postImage: URL}, {merge: true});
                console.log('url registered')
            });
        }
    )
}
axzmvihb

axzmvihb1#

如果你调用的是file.substring(...),那么file似乎是一个文件名。你不能只通过传递文件名来上传文件,因为这会带来安全风险。相反,你需要传递一个Blob | Uint8Array | ArrayBuffer,如这里和这里所示,通常是通过传递你从中获得文件名的File引用。

px9o7tmv

px9o7tmv2#

我在使用tinymce的angular 14和angular fire 7时遇到了一个奇怪的问题。上传图像并选择文件将正确上传到firebase,但将相同的图像文件拖放到tinymce将导致文件以9字节八位字节流文件的形式上传到firebase,就像你看到的那样。检查blobInfo,它都显示正确,文件名正确,大小正确,image/png作为contentType,但AngularFireStorage.upload方法只是忽略了元数据。最终使用blobInfo上的.base64方法使其工作,并使用.putString方法将其发送到firebase。

images_upload_handler: (blobInfo:any) => {
  const file: any = blobInfo.base64();
  const filePath = `${this.currentTemplateItemId}-${blobInfo.blob().name}`;
  const ref = this.storage.ref(filePath);
  const metadata = { contentType: blobInfo.blob().type };
  const task = ref.putString(file, "base64", metadata);
  const promise = new Promise<string>((resolve, reject) => {
    task
      .snapshotChanges()
      .pipe(
        finalize(() =>
          ref
            .getDownloadURL()
            .pipe(last())
            .subscribe((url) => {
              resolve(url);
            })
        )
      )
      .subscribe(res => {
      }, error => {
        reject('Error uploading image. Please ensure the file is less than 150kb');
      });
  });

只需使用this.storage.upload(filePath,blobInfo.blob(),metadata)(它应该做同样的事情,但发送blob而不是不工作)。与您所看到的略有不同,但在这里留下这个想法,以防其他人也遇到图像上传到firebase的问题,最终以9字节文件结束。

相关问题