У меня большой вопрос по поводу Strapi v4, я понимаю, что его задают многие. Но я провел 4 часа в Интернете и нашел много случаев, но ни один из них не раскрыт и не заброшен.
Вопрос в следующем (см. скриншоты)
У меня есть компонент, у него есть поле Media, как загрузить изображение в это поле с помощью RestAPI?
Мне удалось загрузить изображение, если мое свойство (это родительский элемент коллекции свойств) имеет только поле «Медиа» без каких-либо компонентов/динамических зон/блоков.
Но на данный момент реализация требует, чтобы я использовал вложенное поле Медиа, так как этот компонент повторяется, и у него будут разные элементы (комнаты), и в каждой комнате своя фотография, или массив фотографий.
Я пытаюсь выяснить, какой запрос мне нужно сделать (или создать собственный контроллер), чтобы, когда я передаю правильные данные и путь в formData, я загружал, а затем привязывал изображение к определенному полю в компоненте. ?
На самом деле вложенность глубже, но в целом вопрос ясен.
Буду благодарен за любой совет.


Что ж, это точка борьбы для многих разработчиков. Основная причина, по которой он не популярен:
the forms aren't supposed to work that way
По сути, когда пользователь создает форму, вы на самом деле не хотите обрабатывать загрузку при отправке формы, но вы хотите загружать элемент по мере его добавления в форму (используя /upload). Это избавит вас от таких ошибок, как слишком большой размер тела, гораздо более простая проверка и других проблем. Если вы заметили, что работа Strapi Media точно такая же, как и вы, вы загружаете в библиотеку, а затем добавляете...
В любом случае, секрет здесь в методе lodashget, который сводит адрес к чему-то вроде my.array[0].media[0]
Итак, допустим, у нас есть Тип контента article, повторяющийся компонент с именем section и в нем есть поле image:
const formData = new FormData();
formData.append('files.section[0].image', file, file.name)
P.s. Нужен тест, взятый из головы
документ гласит:
If you want to upload files for a repeatable component, you will have to specify the zero-based index of the item you want to add the file to, using the following syntax: files.my_component_name[the_index].attribute_name. For instance, if you put 3 components and the file is for the second one, the index will be 1.
Надеюсь, поможет!
Примерно это я и имел в виду во втором абзаце, однако вопрос заключался в том, как загрузить из REST…
Ага. Затем просто выполните formData и отправьте его по этому маршруту. Возможно мы просто не правильно понимаем друг друга. Бывает
На самом деле я нашел проблему и простое решение. Не нужно чего-то добиваться, что-то куда-то писать.
Вы можете использовать эту конечную точку (из Strapi/admin — DevTools — Network).
localhost:8080/api/properties/${id}?populate = {whatever you want}
А потом просто поставьте, например:
InterriorGallery (компонент - Single) --> SubGallery (повторяемый) --> [1 или любой индекс нужного вам места] --> Media (я назвал это поле так) -- и поместите сюда идентификатор ЗАГРУЖЕННОГО изображения.
В общем, все просто: сначала загрузите массив изображений, возьмите идентификатор и поместите его с помощью этого PUT. Когда вы сделаете PUT (вы можете посмотреть сами), для этого потребуются некоторые { data: { ...credentials} } вещи (как обычно), но в целом работает очень легко и хорошо.
НЕ ЗАБЫВАЙТЕ, что все отношения, которые у вас есть в текущей коллекции/одиночном типе, также должны быть переданы, иначе либо у вас возникнет ошибка, требующая передачи.
Без необходимости использования пользовательских контроллеров, конечных точек... и т. д. Я знаю, что это может быть неправильно, но это то, что есть.
Итак, еще раз:
РЕШЕНИЕ
На самом деле я нашел проблему и простое решение. Не нужно чего-то добиваться, что-то куда-то писать. Вы можете использовать эту конечную точку (из Strapi/admin -- DevTools -- Network) localhost:8080/api/properties/${id}?populate = {что хотите} А затем просто введите, например: InterriorGallery ( компонент - Single) --> SubGallery (повторяемый) --> [1 или любой индекс нужного вам места] --> Media (я назвал это поле так) -- и поместите сюда идентификатор ЗАГРУЖЕННОГО изображения. В общем, все просто: сначала загрузите массив изображений, возьмите идентификатор и поместите его с помощью этого PUT.