# #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-это имя каждой папки.