当前位置: 首页 > 知识库问答 >
问题:

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

孟财
2023-03-14

我在我的网站上有一个处理文件上传的页面,但是自从我升级了Firebase(我猜是Firebase v7/8)后,这个特殊的功能不再工作了。

为了在firebase存储中处理文件上载,我创建了一个自定义钩子,在这里我使用useffect,因为每次有新的文件值时都需要运行它。我为试图上载的文件传递了一个参数(文件),并将其存储在数据库中,这样数据库就包含了所有图像的url。然后,我使用这些数据将图像加载到react组件中。

我得到的错误是:

未捕获类型错误:projectStorage.ref不是函数

由于我使用的是Firebase v9,所以我对它有点困惑,不知道要更改什么。谢谢你的帮助,我真的很感激。

useStorage.jsx(自定义挂钩)

import {projectStorage, projectFirestore, timestamp} from '../Firebase'
import { useEffect, useState } from 'react'


function useStorage(file) {
    const [progress, setProgress] = useState(0);
    const [error, setError] = useState(null);
    const [url, setUrl] = useState(null);
   
    useEffect(() => {

        const storageRef = projectStorage.ref(file.name)
        const collectionRef = projectFirestore.collection('images');

        storageRef.put(file).on('state_changed', (snap) => {
            let percent = (snap.bytesTransferred / snap.totalBytes) * 100;
            setProgress(percent >> 0); // or Math.trunc() 
        }, (err) => {
            setError(err);
        }, async () =>{
            const url = await storageRef.getDownloadURL();
            const createdAt = timestamp();
            collectionRef.add({ url, createdAt});
            setUrl(url);
        });

    }, [file]);

    return {progress, url, error};
}

export default useStorage;

共有2个答案

谭骏
2023-03-14

我是这样加的

uploadTask.on("state_changed", (snapshot) => {
            console.log(snapshot);
            let percent = (snap.bytesTransferred / snap.totalBytes) * 100;
                setProgress(percent >> 0); 
            }, (err) => {
                setError(err);
            }, async () =>{
                const url = await storageRef.getDownloadURL();
                const createdAt = timestamp();
                collectionRef.add({ url, createdAt});
                setUrl(url);
        });

但是得到了一个错误未捕获(在promise)参考:快照没有定义

洪雨石
2023-03-14

有一个顶级函数uploadByteResubable()可以在监视进度的同时上载文件。尝试重构代码,如下所示:

import {projectStorage, projectFirestore, timestamp} from '../Firebase'
import { ref as storageRef, uploadBytesResumable } from "firebase/storage";

useEffect(() => {
  // Creating a storage reference
  const storageReference = storageRef(projectStorage, file.name);
  
  // Creating an upload task 
  const uploadTask = uploadBytesResumable(storageReference, file);

  // Monitoring upload progress
  uploadTask.on("state_changed", (snapshot: any) => {
    console.log(snapshot);
    // render progress
  });
}, [file])

在Web上使用云存储上传文件时检查留档。

 类似资料:
  • 问题内容: 我试图了解如何使用Node.js在Firebase Storage中上传文件。我的第一次尝试是使用Firebase库: 但是事实证明,Firebase无法从服务器端上传文件,正如在文档中明确指出的那样: Firebase存储不包含在服务器端Firebase npm模块中。相反,您可以使用gcloud Node.js客户端。 在代码中,您可以使用以下方式访问存储分区: 我们可以在没有Go

  • 但事实证明,Firebase无法从服务器端上传文件,正如它在文档中明确说明的那样: Firebase存储不包括在服务器端Firebase npm模块中。相反,您可以使用gcloud Node.js客户机。 我的第二次尝试是使用库,就像文档中提到的:

  • 我需要帮助使用Firebase函数将大型JSON文件从Firebase存储流到Firestore。 我想将几个大的换行JSON文件(11x700MB)传输到FireStore。我正在尝试从Firebase存储加载它们,对文件进行流式处理,并将内容写入Firestore集合。 我现在不知道该怎么做,但我很感激你的帮助。

  • 我试图上传一个图像文件,我得到了使用Imagepicker。 但上面的代码返回以下错误 VERBOSE-2:ui\u dart\u状态。cc(186)]未处理的异常:MissingPluginException(未找到方法任务的实现#通道插件上的startPutFile.flatter.io/firebase_存储)#0 MethodChannel_invokeMethod包:flatter/..

  • 根据文档,我必须把文件名传递给函数才能上传一个文件。 我想能做这样的事

  • 我们有我们的公司网站,我们经常有很多工作机会。因此,我们创建了一个表格,有兴趣的候选人可以直接申请。我们也有一个简历上传工具,现在简历上传和存储使用这个简历存储在我们的服务器上,但我们不想浪费服务器空间,所以我们考虑只创建一个专门的文件夹为简历在谷歌驱动器,无论何时用户上传他的简历从我们的网站,它将得到一个谷歌驱动器文件夹存储。这可能吗。我们不想做与谷歌表单或表单+,因为我们有表单匹配我们的网站主