Загрузите несколько файлов с Firebase в ReactJS

# #javascript #reactjs #firebase #firebase-storage

Вопрос:

У меня есть несколько папок в хранилище firebase, которые содержат изображения (каждая папка соответствует сущности).https://i.stack.imgur.com/s9ZpX.png

Когда я хочу загрузить URL-адрес каждой сущности, firebase приносит мне все изображения, которые у нее есть в хранилище, даже если она выполняет привязку к каждой сущности.

 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 приносит мне все изображения вместо того, чтобы приносить мне изображения отдельно для каждого объекта.

Я надеюсь, что вы поняли, и я жду ваших ответов или любых вопросов, которые у вас есть.

Спасибо!

Обновить

Это консоль.журнал(номера) https://i.stack.imgur.com/rQkoB.png

Ответ №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(‘изображения’).listAll() вернет /изображения/uid в качестве префикса.
  • root.child(‘изображения/uid’).listAll() вернет файл в виде элемента.

Вы можете узнать больше об этом здесь.

Ваш код с группировкой загрузок:

 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 }, []);
 

Комментарии:

1. Спасибо @Tarik, но у меня та же проблема. Я думаю, что проблема заключается в том, как выполняется каждый снимок roomSnapshot, а не в том, как они загружаются, потому что все изображения из всех папок загружаются и помещаются во все объекты.

2. Не могли бы вы, пожалуйста, объяснить немного подробнее, какой результат вы хотите получить из своего кода и каков текущий? Может быть, я неправильно понял вашу проблему.

3. Конечно, я приношу номера из магазина firestore. Изображения этих объектов находятся в хранилище. Эффект использования переносит комнаты и внутри снимка. Для начала я хочу загрузить URL-адрес изображений, чтобы перенести все данные в комнату. Но когда я выполняю поиск по элементу , это приносит мне все изображения, которые находятся во всех папках в хранилище, оно не разделяет их по помещению, что должно произойти, если два файла будут работать один внутри другого. Я не знаю, полностью ли это понято, но я не являюсь носителем английского языка, извините за это.

4. Прежде всего: ваш английский великолепен! Но чего я не понимаю, так это того, что вы просматриваете все комнаты, получаете из них URL-адреса для загрузки и храните данные всех комнат в одном массиве? Таким образом, вы соберете все URL-адреса для загрузки в один массив. Вам нужно только разделить эти значения в разных массивах или сгруппировать их в массиве?

5. хорошо, это именно то, что я хочу сделать, поэтому firebase не может предоставить мне только фотографии в папках. Просто загрузите все, что у вас есть в хранилище? Если вы видите ссылку, вы можете увидеть папки в том виде, в каком они находятся в хранилище, а в коде-данные документа (). RoomPhotoId-это имя каждой папки.