Extra Block Types (EBT) - New Layout Builder experience❗

Extra Block Types (EBT) - styled, customizable block types: Slideshows, Tabs, Cards, Accordions and many others. Built-in settings for background, DOM Box, javascript plugins. Experience the future of layout building today.

Demo EBT modules Download EBT modules

❗Extra Paragraph Types (EPT) - New Paragraphs experience

Extra Paragraph Types (EPT) - analogical paragraph based set of modules.

Demo EPT modules Download EPT modules

Scroll
20/04/2025, by Ivan

Загрузка файлов теперь поддерживается, см. заметки к релизу для получения подробностей.

На изображениях ниже показано, как использовать Postman для загрузки файла через JSON:API:

Json API File header
Заголовки JSON:API в Postman.

Пример curl-запроса для загрузки аватарки пользователя

Предполагается, что вы уже прошли аутентификацию и получили CSRF-токен в предыдущем запросе.

curl -s -X POST -b cookie.txt \
  --header "Accept: application/vnd.api+json" \
  --header "Content-Type: application/octet-stream" \
  --header "X-CSRF-Token: $TOKEN" \
  --header 'Content-Disposition: file; filename="test.jpg"' \
  --data-binary "@test.jpg" \
  http://localhost/jsonapi/user/user/$UUID/user_picture

Советы при использовании axios (или других HTTP-библиотек) и Node.js:

Вы можете получить изображение в формате Buffer, например:

<Buffer ff d8 ff e0 00 10 4a 46 49 46 ... 582549 more bytes>

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

Для корректной отправки нужно использовать класс Buffer и метод from.

Пример: допустим, вы получили объект из AWS S3 SDK и сохранили его Body как буфер. Далее используем Buffer.from и отправим его в JSON:API с помощью axios:

const buffer = storedFile.Body; // содержит бинарные данные

const drupalData = await axios({
  method: "post",
  url: url, // URL вида /jsonapi/media/image/field_media_image/
  auth: {
    username: "xxx",
    password: "xxx"
  },
  headers: {
    'Accept': 'application/vnd.api+json',
    'Content-Type': 'application/octet-stream',
    'X-CSRF-Token': token, // сначала получите с /session/token
    'Content-Disposition': 'file; filename="' + filename + '"',
  },
  data: Buffer.from(buffer, "binary"),
});

console.log(drupalData); // UUID нового файла находится в drupalData.data.id

Это особенно полезно при использовании AWS Lambda и загрузке файлов из S3 в Drupal.