Como enviar arquivos para o Drupal 8 via REST


9

Eu posso criar artigos via RESTsem problemas. Mas não consigo descobrir como enviar arquivos.

Como envio arquivos (imagens) para o Drupal 8 via REST?

Atualizar:

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"

Publicar imagem (sem conteúdo da entidade):

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

Não consigo descobrir como criar o entity content.



Parece que existem alguns bloqueadores para arquivos POST. Um é a codificação de arquivos base64 ( disponível o patch drupal.org/node/1927648 ) e o outro são as permissões de terminal REST para a criação de exclusão de atualização ( drupal.org/node/2310307 disponível). Ainda não testei nenhum deles.
Queenvictoria

Respostas:


4
  • Aplique o patch ao núcleo: https://www.drupal.org/node/1927648
  • Instale a IU Rest Rest usando: drush dl restui-8.x-1.x
  • Vá para / admin / config / services / rest e ative o arquivo /entity/file/{file}
  • Em / admin / people / Permissions, defina todas as permissões necessárias
  • Verifique se a pasta de arquivos existe e tem permissões adequadas
  • Codifique a imagem usando a ferramenta de comando base64
  • POST para 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"}] }

    insira a descrição da imagem aqui


Ao enviar um arquivo com êxito, você recebe um 201, mas nada é retornado referente a onde o arquivo está. Eu esperaria que um ID ou local do arquivo fosse retornado. Como fazemos referência ao arquivo depois que ele é carregado?
2111 Ronnie

Eu modifiquei com EntityResource.phpbase no seu patch e na linha 117, retornei o ID da entidade e agora tenho pelo menos uma referência a ele dessa maneira:$response = new ResourceResponse(NULL, 201,['id' => $entity->id()]);
Ronnie

@ Ronnie Com base na resposta, espero que o arquivo esteja localizado na pasta de arquivos do seu site.
Blake Frederick

11
@BlakeFrederick Isso realmente não me ajuda, se eu precisar salvar uma referência ao arquivo no banco de dados. Pense neste cenário: eu tenho um tipo de conteúdo, um campo de imagem. Uma imagem precisa ser associada a esse nó quando criada. Quando você carrega o arquivo, nada é retornado, exceto um 201 ... o que eu dou ao nó para apontar para a imagem? Por isso acrescentei $entity->id()a resposta. I passar o código de entidade para o nó e agora esse nó sabe sobre a imagem
Ronnie

@ Ronnie - Eu mesmo estou trabalhando nisso, mas percebo que, quando o arquivo é transmitido com sucesso, uma linha correspondente é adicionada à file_managedtabela do Drupal . Esta linha tem um único fid. Acredito que o próximo passo é POST a criação de um novo nó com um campo de imagem e use o fidpara associar o campo de imagem ao arquivo. Se eu entendi, a questão é como determinar fidquando nada será retornado. Hoje, notei em um thread do Drupal que a versão futura da interface do usuário REST retornará a entidade completa, mas não tenho certeza de como resolver esse problema no momento.
Blake Frederick

1
  1. Instale e ative os módulos RestUi e File Entity .
  2. Vá para 'admin / config / services / rest' e ative o recurso de arquivo com o método post junto com os formatos json e hal_json
  3. Ativar permissões de postagem Acesse o POST no arquivo resource @ admin / people / Permissions
  4. URL da postagem - http: //d8.local/entity/file? _Format = hal_json
  5. Seguinte formato de dados de postagem (use o codificador base64 para dados de imagem)

    { "_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. Defina Autorização, Tipo de Conteúdo nos cabeçalhos. (Autorização: xxxxxxxx Básico Tipo de Conteúdo: application / hal + json)

  7. Use o seguinte 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. Vá e verifique o arquivo aqui - admin / content / files


0

Você pode instalar o módulo de interface do usuário REST para ver quais pontos de extremidade você pode usar.

Interface de usuário muito básica para o módulo REST do Drupal 8.

Como também permite configurar quais recursos são expostos por qual autenticação.

Observe que a interface do usuário atualmente fornece os pontos de extremidade incorretos: - Caminhos REST URI alterados para caminhos canônicos


Restante terminal da interface do usuário para o arquivo: / file / {id}. Eu atualizei a pergunta.
precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.