Как отправить файлы в 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.

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

Ответы:

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

    {"_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"}] }

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

gcardinal
источник
При успешной загрузке файла вы получаете 201, но ничего не возвращается относительно того, где находится файл. Я ожидаю, что ID или местоположение файла будут возвращены. Как мы ссылаемся на файл после его загрузки?
Ронни
Я изменил, 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 UI вернет полную сущность, но я пока не уверен, как решить эту проблему.
Блейк Фредерик
1
  1. Установите и активируйте модули RestUi и File Entity .
  2. Перейдите в 'admin / config / services / rest' и включите File Resource с методом 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. Установите авторизацию, Content-Type в заголовках. (Authorization: Basic xxxxxxxx Content-Type: 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. Идите и проверьте файл здесь - admin / content / files

Кришна Кант
источник
0

Вы можете установить модуль REST UI, чтобы увидеть, какие конечные точки вы можете использовать.

Очень простой пользовательский интерфейс для модуля REST Drupal 8.

Кроме того, он позволяет вам настроить, какие ресурсы подвергаются какой аутентификации.

Обратите внимание, что пользовательский интерфейс в настоящее время предоставляет неверные конечные точки: - REST URI пути изменены на канонические пути

Клеменс Толбом
источник
Конечная точка пользовательского интерфейса для файла: / file / {id}. Я обновил вопрос.
user32063