Як надсилати файли на Drupal 8 через REST


9

Я можу створювати статті RESTбез проблем. Але я не можу зрозуміти, як подавати файли.

Як я можу надсилати файли (зображення) на Drupal 8 через REST?

Оновлення:

REST UI - File: /file/{id}

Example image added in article: 
/admin/content/files -> /admin/content/files/usage/1

file {id} = 1?

Get file id 1:

curl --request GET --user admin:admin --header 'Accept: application/hal+json' http://d8.local/file/1
A fatal error occurred: No route found for "GET /file/1"

Опублікувати зображення (без вмісту сутності):

curl --request POST --user admin:admin --header 'Content-type: application/hal+json' http://d8.local/entity/file
{"error":"No entity content received."}

Я не можу дізнатися, як створити entity content.



Схоже, є пара блокаторів для файлів POSTing. Один - базове кодування файлів ( доступний патч drupal.org/node/1927648 ), а другий - дозволи на кінцеву точку REST для створення видалення оновлення ( доступний патч drupal.org/node/2310307 ). Я ще жодного з них не тестував.
Queenvictoria

Відповіді:


4
  • Застосувати патч до ядра: https://www.drupal.org/node/1927648
  • Встановіть інтерфейс відпочинку за допомогою: drush dl restui-8.x-1.x
  • Перейдіть до / admin / config / services / rest та активуйте File /entity/file/{file}
  • Під / admin / people / permissions встановлюються всі необхідні дозволи
  • Переконайтеся, що папка файлів існує та має належні дозволи
  • Кодування зображення за допомогою командного інструменту base64
  • POST на drupal.url / сутність / файл /

    {"_links":
    {
      "type":{"href":"http://drupal.url/rest/type/file/file"}
    },
      "filename":[{"value":"input.jpg"}],
      "filemime":[{"value":"image/jpeg"}],
      "data":[{"value":"insert-output-from-base64-here"}] }

    введіть тут опис зображення


При успішному завантаженні файлу ви отримуєте 201, але нічого не повертається, що стосується того, де знаходиться файл. Я очікую повернення ідентифікатора чи місцезнаходження файлу. Як ми посилаємось на файл після його завантаження?
Ронні

Я змінив EntityResource.phpна основі вашого патчу та рядка 117, я повернув ідентифікатор особи, і тепер принаймні маю посилання на нього таким чином:$response = new ResourceResponse(NULL, 201,['id' => $entity->id()]);
Ронні

@Ronnie Виходячи з відповіді, я очікую, що файл буде розміщений у папці файлів вашого сайту.
Блейк Фредерік

1
@BlakeFrederick Це не дуже допомагає мені, хоча мені потрібно зберегти посилання на файл у базі даних. Подумайте про цей сценарій: у мене є вміст поля зображення. Зображення повинно бути пов’язане з цим вузлом при його створенні. Коли ви завантажуєте файл, нічого не повертається, окрім 201 ... що я даю цьому вузлу, щоб вказати на зображення? Тому я додав відповідь $entity->id()у відповідь. Я передаю ідентифікатор сутності в вузол, і тепер, коли вузол знає про зображення
Ронні

@Ronnie - Я просто сам працюю над цим, але помічаю, що коли файл успішно передається серверу, до file_managedтаблиці Drupal додається відповідна рядок . Цей ряд має унікальний характер fid. Я вважаю, що наступним кроком є ​​POST створення нового вузла з полем зображення та використання fidдля об'єднання поля зображення з файлом. Якщо я вас розумію, питання полягає в тому, як визначити, fidколи нічого не повертається. Сьогодні я помітив із потоку Drupal, що майбутня версія інтерфейсу REST поверне повну сутність, але наразі не знаю, як вирішити цю проблему.
Блейк Фредерік

1
  1. Встановіть та увімкніть модулі RestUi та File Entity .
  2. Перейдіть у розділ 'admin / config / services / rest' та ввімкніть файл- ресурс методом post разом із форматами json та hal_json
  3. Увімкнути дозволи на публікацію доступу до POST на файловому ресурсі @ admin / people / permissions
  4. URL публікації - http: //d8.local/entity/file? _Format = hal_json
  5. Наступний формат публікації даних (використовуйте енкодер base64 для даних зображень)

    { "_links": { "type": { "href": "http://d8.local/rest/type/file/image" } }, "filename": [ { "value": "favicon-32x32.png" } ], "filemime": [ { "value": "image/png" } ], "filesize": [ { "value": "488" } ], "type": [ { "target_id": "image" } ], "data": [ { "value": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAkUExURUxpcSOq4SOq4SOq4SOq4SOq4SOq4SOq4SOq4SOq4SOq4SOq4U0m8UcAAAAMdFJOUwD/EvAm2qhTPMRrkl4CMYAAAAE1SURBVCjPXZG/S8NQEMePR7Ehnb48khC7BEFFnYJD6/aWOLilVBy6WBVc648/oCii1KlFKDrFwV2tqH+edy9Rk7zh8e7Dfe++944oP5dUO59RDQyPqrFK/WqKCzxUwA30oJyymervlVK8PsVBOd85hh6pyflfhwXg024cjguwBqCjhsCsSOAn+k4MBGpUWAB6Tb6W1VxAgv+MfcPgWUBgazjxoYwlQLrsmBa6MhbH3hep2yu6QJuowWL9Yfs1U4QRSbWOjRts0DMCdEbqjl8s1kYkPqmX7YGRfgy4aJe2IB+0wZJI2s7ojEGbWtJejL1aL55h+wGDVWTWix47+cAug6kAycjs+LkkjFzku0h6dC3D01KxCmdOLrt7pyQ0+Z/tRXT/eEr0dvL7y6zkrbhPtYVPrOAHKZQ53IyepQMAAAAASUVORK5CYII=" } ] }

  6. Встановити Авторизацію, Тип вмісту в заголовках. (Авторизація: Основні xxxxxxxx Тип вмісту: application / hal + json)

  7. Використовуйте наступний php curl

    $curl = curl_init();
    curl_setopt_array($curl, array(
      CURLOPT_URL => "http://d8.local/entity/file?_format=hal_json",
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 30,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => "POST",
      CURLOPT_POSTFIELDS => "{\n  \"_links\": {\n    \"type\": {\n      \"href\": \"http://d8.local/rest/type/file/image\"\n    }\n  },\n  \"filename\": [\n    {\n      \"value\": \"favicon-32x32.png\"\n    }\n  ],\n  \"filemime\": [\n    {\n      \"value\": \"image/png\"\n    }\n  ],\n  \"filesize\": [\n    {\n      \"value\": \"488\"\n    }\n  ],\n  \"type\": [\n    {\n      \"target_id\": \"image\"\n    }\n  ],\n  \"data\": [\n    {\n      \"value\": \"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAkUExURUxpcSOq4SOq4SOq4SOq4SOq4SOq4SOq4SOq4SOq4SOq4SOq4U0m8UcAAAAMdFJOUwD/EvAm2qhTPMRrkl4CMYAAAAE1SURBVCjPXZG/S8NQEMePR7Ehnb48khC7BEFFnYJD6/aWOLilVBy6WBVc648/oCii1KlFKDrFwV2tqH+edy9Rk7zh8e7Dfe++944oP5dUO59RDQyPqrFK/WqKCzxUwA30oJyymervlVK8PsVBOd85hh6pyflfhwXg024cjguwBqCjhsCsSOAn+k4MBGpUWAB6Tb6W1VxAgv+MfcPgWUBgazjxoYwlQLrsmBa6MhbH3hep2yu6QJuowWL9Yfs1U4QRSbWOjRts0DMCdEbqjl8s1kYkPqmX7YGRfgy4aJe2IB+0wZJI2s7ojEGbWtJejL1aL55h+wGDVWTWix47+cAug6kAycjs+LkkjFzku0h6dC3D01KxCmdOLrt7pyQ0+Z/tRXT/eEr0dvL7y6zkrbhPtYVPrOAHKZQ53IyepQMAAAAASUVORK5CYII=\"\n    }\n  ]\n}",
      CURLOPT_HTTPHEADER => array(
        "authorization: Basic " .base64_encode('User:Password'),
        "cache-control: no-cache",
        "content-type: application/hal+json"
      ),
    ));
    
    $response = curl_exec($curl);
    $err = curl_error($curl);
    
    curl_close($curl);
    
    if ($err) {
      echo "cURL Error #:" . $err;
    } else {
      echo $response;
    }
  8. Перейдіть і перевірте файл тут - адміністратор / вміст / файли


0

Ви можете встановити модуль REST UI, щоб побачити, які кінцеві точки ви можете використовувати.

Дуже базовий користувальницький інтерфейс для модуля REST Drupal 8.

Оскільки це також дозволяє вам налаштувати, які ресурси піддаються дії аутентифікації.

Зверніть увагу, що на даний момент інтерфейс користувача дає неправильні кінцеві точки: - Шлях RRI URI змінено на канонічні


Кінцева точка залишкового інтерфейсу для файлу: / file / {id}. Я оновив питання.
user32063
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.