STRAPI RestAPI — Как загрузить изображение в поле Media, которое находится в компоненте? 4.2

У меня большой вопрос по поводу Strapi v4, я понимаю, что его задают многие. Но я провел 4 часа в Интернете и нашел много случаев, но ни один из них не раскрыт и не заброшен.

Вопрос в следующем (см. скриншоты)

У меня есть компонент, у него есть поле Media, как загрузить изображение в это поле с помощью RestAPI?

Мне удалось загрузить изображение, если мое свойство (это родительский элемент коллекции свойств) имеет только поле «Медиа» без каких-либо компонентов/динамических зон/блоков.

Но на данный момент реализация требует, чтобы я использовал вложенное поле Медиа, так как этот компонент повторяется, и у него будут разные элементы (комнаты), и в каждой комнате своя фотография, или массив фотографий.

Я пытаюсь выяснить, какой запрос мне нужно сделать (или создать собственный контроллер), чтобы, когда я передаю правильные данные и путь в formData, я загружал, а затем привязывал изображение к определенному полю в компоненте. ?

На самом деле вложенность глубже, но в целом вопрос ясен.

Буду благодарен за любой совет.

недвижимостьответ

последний

Применение градиента к изображению с помощью CSS
Применение градиента к изображению с помощью CSS
Здравствуйте, братья и сестры, как дела? Недавно я застрял на применении градиента к изображению. Я применял это много раз, но иногда наши требования...
Получение URL-адреса изображения курса в Moodle с помощью PHP
Получение URL-адреса изображения курса в Moodle с помощью PHP
Moodle - это популярная система управления обучением с открытым исходным кодом, используемая многими учебными заведениями и организациями по всему...
0
0
460
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Что ж, это точка борьбы для многих разработчиков. Основная причина, по которой он не популярен:

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.

Надеюсь, поможет!

На самом деле я нашел проблему и простое решение. Не нужно чего-то добиваться, что-то куда-то писать. Вы можете использовать эту конечную точку (из Strapi/admin -- DevTools -- Network) localhost:8080/api/properties/${id}?populate = {что хотите} А затем просто введите, например: InterriorGallery ( компонент - Single) --> SubGallery (повторяемый) --> [1 или любой индекс нужного вам места] --> Media (я назвал это поле так) -- и поместите сюда идентификатор ЗАГРУЖЕННОГО изображения. В общем, все просто: сначала загрузите массив изображений, возьмите идентификатор и поместите его с помощью этого PUT.

Andrey Shaposhnikov 12.04.2024 19:04

Примерно это я и имел в виду во втором абзаце, однако вопрос заключался в том, как загрузить из REST…

antokhio 12.04.2024 21:07

Ага. Затем просто выполните formData и отправьте его по этому маршруту. Возможно мы просто не правильно понимаем друг друга. Бывает

Andrey Shaposhnikov 13.04.2024 22:03
Ответ принят как подходящий

На самом деле я нашел проблему и простое решение. Не нужно чего-то добиваться, что-то куда-то писать.

Вы можете использовать эту конечную точку (из Strapi/admin — DevTools — Network).

localhost:8080/api/properties/${id}?populate = {whatever you want}

А потом просто поставьте, например:

InterriorGallery (компонент - Single) --> SubGallery (повторяемый) --> [1 или любой индекс нужного вам места] --> Media (я назвал это поле так) -- и поместите сюда идентификатор ЗАГРУЖЕННОГО изображения.

В общем, все просто: сначала загрузите массив изображений, возьмите идентификатор и поместите его с помощью этого PUT. Когда вы сделаете PUT (вы можете посмотреть сами), для этого потребуются некоторые { data: { ...credentials} } вещи (как обычно), но в целом работает очень легко и хорошо.

НЕ ЗАБЫВАЙТЕ, что все отношения, которые у вас есть в текущей коллекции/одиночном типе, также должны быть переданы, иначе либо у вас возникнет ошибка, требующая передачи.

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

Итак, еще раз:

  1. Загрузите все изображения в /api/upload && Соберите их идентификаторы в массиве[]
  2. Promise.All() их все в ваше свойство ${item}:${item} в Strapi с помощью PUT (работает для блоков, динамической зоны, компонентов, компонентов -> Компонент)

РЕШЕНИЕ

Другие вопросы по теме