【问题标题】:Download multiple files from Firebase in ReactJS在 ReactJS 中从 Firebase 下载多个文件
【发布时间】:2021-08-08 09:54:02
【问题描述】:

我在 Firebase 存储中有几个包含图像的文件夹(每个文件夹对应一个实体)。https://i.stack.imgur.com/s9ZpX.png

当我想下载每个实体的 url 时,firebase 所做的就是将它在存储中的所有图像带给我,即使它对每个实体执行 forEach。

useEffect(() => {
setLoading(true);
Promise.all([getRooms(), getLocation()])
  .then((values) => {
    const roomsSnapshot = values[0];
    const rooms = [];
    const pUrl = [];
    roomsSnapshot.forEach((doc) => {
      const splitAddress = doc.data().address.split(", ");
      formatedAddress.current = splitAddress[1] + " " + splitAddress[0];

    //Download from storage//

      storage
        .ref(`${doc.data().roomPhotoId}/`)
        .list()
        .then(function (result) {
          result.items.forEach((imageRef) => {
            imageRef.getDownloadURL().then((url) => {
              console.log(url)
              roomItems.push(url)

            });
          });
          setRoomsImagesCounter(roomsImagesCounter + 1);
          // no photos scenario
          if (result.items.length === 0) {
            setLoading(false);
          }
        });

      //pushing entity data//

      rooms.push({
        ...doc.data(),
        id: doc.id,
        photosURL: roomItems,
        shortAddress: formatedAddress.current,
        coordsAddress: coords.current,
      });
    });
    console.log(rooms);
    setRooms(rooms);
    // getPhotos(rooms);

    setLoading(false);
  })
  .catch((err) => {
    console.log("Error getting getting rooms or user role", err);
  });
// eslint-disable-next-line react-hooks/exhaustive-deps }, []);

我不知道为什么 firebase 会为我提供所有图像,而不是为每个实体分别提供图像。

希望您已经理解,我等待您的回答或您的任何问题。

谢谢!

更新

这是 console.log(rooms) https://i.stack.imgur.com/rQkoB.png

【问题讨论】:

    标签: javascript reactjs firebase firebase-storage


    【解决方案1】:

    您可以尝试像这样创建存储ref

    // Create a reference under which you want to list
    var listRef = storage.ref().child(`${doc.data().roomPhotoId}/`);
    
    // Find all the prefixes and items.
    listRef.listAll()
      .then((res) => {
        res.prefixes.forEach((folderRef) => {
          // All the prefixes under listRef.
          // You may call listAll() recursively on them.
        });
        res.items.forEach((itemRef) => {
          // All the items under listRef.
        });
      }).catch((error) => {
        // Uh-oh, an error occurred!
      });
    

    确保使用listAll

    请注意:

    • root.child('images').listAll() 将返回 /images/uid 作为前缀。
    • root.child('images/uid').listAll() 将文件作为项目返回。

    您可以在here找到更多相关信息。

    您对 downloadURLS 进行分组的代码:

    useEffect(() => {
    setLoading(true);
    Promise.all([getRooms(), getLocation()])
      .then((values) => {
        const roomsSnapshot = values[0];
        const rooms = [];
        const pUrl = [];
        roomsSnapshot.forEach((doc) => {
          const splitAddress = doc.data().address.split(", ");
          formatedAddress.current = splitAddress[1] + " " + splitAddress[0];
    
        //Download from storage//
    
          rooms[`${doc.data().roomPhotoId}`]=[]
    
          storage
            .ref(`${doc.data().roomPhotoId}/`)
            .list()
            .then(function (result) {
              result.items.forEach((imageRef) => {
                imageRef.getDownloadURL().then((url) => {
                  console.log(url)
                  roomItems.push(url)
    
                });
              });
              setRoomsImagesCounter(roomsImagesCounter + 1);
              // no photos scenario
              if (result.items.length === 0) {
                setLoading(false);
              }
            });
    
          //pushing entity data//
    
          rooms[`${doc.data().roomPhotoId}`].push({
            ...doc.data(),
            id: doc.id,
            photosURL: roomItems,
            shortAddress: formatedAddress.current,
            coordsAddress: coords.current,
          });
        });
        console.log(rooms);
        setRooms(rooms);
        // getPhotos(rooms);
    
        setLoading(false);
      })
      .catch((err) => {
        console.log("Error getting getting rooms or user role", err);
      });
    // eslint-disable-next-line react-hooks/exhaustive-deps }, []);
    

    【讨论】:

    • 谢谢@Tarik,但我也有同样的问题。我认为问题在于 roomSnapshot forEach 是如何执行的,而不是因为它们是如何下载的,因为所有文件夹中的所有图像都被下载并推送到所有实体中。
    • 您能否多解释一下您想从代码中得到什么结果以及当前的结果是什么?也许我没有正确解决您的问题。
    • 当然,我把房间实体从 Firestore 带来。这些实体的图像正在存储中。 useEffect 带来了房间和snapshot.forEach 里面,我想下载图片的url 来将所有数据推送到房间。但是,当我执行 itemRef 的 forEach 时,这会给我带来 storage storage 中所有文件夹中的所有图像,它不会按房间分隔它们,如果两个 forEach 在另一个中工作,就会发生这种情况。我不知道它是否被完全理解,但我不是以英语为母语的人,对此感到抱歉。
    • 首先:你的英语很棒!但我不明白的是,你遍历所有房间从它们那里获取每个下载网址并将所有房间的数据存储在一个数组中?这样,您就可以将所有下载 url 放在一个数组中。你只需要将这些值分开不同的数组或将它们分组到数组中吗?
    • 好的,这正是我想要做的,所以 firebase 无法仅将文件夹内的照片带给我。只需下载存储中的所有内容?如果您在链接中看到,您可以看到存储中的文件夹,以及代码中的 doc.data ()。 RoomPhotoId 是每个文件夹的名称。
    猜你喜欢
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多