REST経由でファイルをDrupal 8に送信する方法


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



ファイルをPOSTするためのブロッカーがいくつかあるようです。1つはファイルのbase64エンコーディング(drupal.org/node/1927648パッチが利用可能)であり、もう1つはCreate Update DeleteのRESTエンドポイント権限(drupal.org/node/2310307パッチが利用可能)です。これらのいずれもまだテストしていません。
Queenvictoria 2014

回答:


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で、必要なすべての権限を設定します
  • ファイルフォルダが存在し、適切な権限があることを確認してください
  • コマンドツールbase64を使用して画像をエンコードする
  • drupal.url / entity / file /へのPOST

    {"_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が返されますが、ファイルの場所に関しては何も返されません。ファイルのIDまたは場所が返されることを期待しています。アップロードされたファイルをどのように参照しますか?
ロニー

私は修正EntityResource.phpあなたのパッチおよびライン117オフに基づいて、私は、エンティティのIDを返し、私は今、少なくとも、それを基準にその方法を持っている:$response = new ResourceResponse(NULL, 201,['id' => $entity->id()]);
ロニー・

@ロニー答えに基づいて、私はファイルがあなたのサイトのファイルフォルダにあると思います。
ブレイクフレデリック

1
@BlakeFrederickファイルへの参照をデータベースに保存する必要がある場合でも、これは本当に役に立ちません。このシナリオについて考えてみます。コンテンツタイプに画像フィールドがあります。イメージは、作成時にそのノードに関連付ける必要があります。ファイルをアップロードすると、201以外は何も返されません...そのノードに画像を指すように何を与えますか?その$entity->id()ため、レスポンスにを追加しました。エンティティIDをノードに渡し、そのノードは画像を認識します
Ronnie

@Ronnie-私はこれを自分で処理していますが、ファイルがサーバーに正常に送信されると、対応する行がDrupalのfile_managedテーブルに追加されます。この行には固有のがありfidます。次のステップは、画像フィールドを持つ新しいノードの作成をPOSTし、を使用しfidて画像フィールドをファイルに関連付けることだと思います。私があなたを理解しているなら、問題はfid何が返されないかをどのように決定するかです。今日のDrupalスレッドから、REST UIの将来のバージョンで完全なエンティティが返されることに気付きましたが、今のところこの問題を解決する方法がわかりません。
ブレイクフレデリック

1
  1. RestUiおよびFile Entityモジュールをインストールして有効にします。
  2. 「admin / config / services / rest」に移動し、jsonおよびhal_json形式とともにpostメソッドでファイルリソースを有効にします。
  3. 投稿権限を有効にするファイルリソース @ admin / people / permissionsのPOSTにアクセスします
  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. ヘッダーにAuthorization、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モジュールをインストールして、使用できるエンドポイントを確認できます。

Drupal 8のRESTモジュールの非常に基本的なユーザーインターフェイス。

また、どの認証によってどのリソースが公開されるかを構成することもできます。

UIは現在間違ったエンドポイントを提供していることに注意してください:-REST URIパスが正規パスに変更されました


ファイルの残りのUIエンドポイント:/ file / {id}。質問を更新しました。
user32063 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.