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 파일에 대한 몇 가지 차단기가있는 것 같습니다. 하나는 파일의 base64 인코딩 ( drupal.org/node/1927648 패치 사용 가능)이고 다른 하나는 업데이트 삭제 작성 ( drupal.org/node/2310307 패치 사용 가능)에 대한 REST 엔드 포인트 권한입니다 . 아직이 중 하나를 테스트하지 않았습니다.
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 아래에서 필요한 모든 권한을 설정하십시오.
  • 파일 폴더가 존재하고 적절한 권한을 가지고 있는지 확인하십시오
  • 명령 도구 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 또는 위치가 반환 될 것으로 기대합니다. 업로드 된 파일은 어떻게 참조합니까?
Ronnie

나는 EntityResource.php당신의 패치와 117 번 라인에 기초하여 수정했고, 나는 엔티티 ID를 반환했고 이제 최소한 그런 식으로 그것에 대한 참조를 갖습니다 :$response = new ResourceResponse(NULL, 201,['id' => $entity->id()]);
Ronnie

@Ronnie 대답에 따르면 파일이 사이트의 파일 폴더에있을 것으로 기대합니다.
Blake Frederick

1
@BlakeFrederick 데이터베이스에 파일에 대한 참조를 저장 해야하는 경우 실제로 도움이되지 않습니다. 이 시나리오를 생각해보십시오. 컨텐츠 필드에 이미지 필드가 있습니다. 이미지는 작성 될 때 해당 노드와 연관되어야합니다. 파일을 업로드 할 때 201을 제외하고 아무것도 반환되지 않습니다. 해당 노드가 이미지를 가리 키도록하려면 어떻게해야합니까? 그래서 내가 $entity->id()응답에 추가했습니다 . 엔티티 ID를 노드에 전달하면 이제 해당 노드가 이미지에 대해 알고 있습니다.
Ronnie

@Ronnie-나는이 일을 직접하고 있지만 파일이 서버에 성공적으로 전송되면 해당 행이 Drupal의 file_managed테이블에 추가됩니다 . 이 행은 고유 fid합니다. 다음 단계는 새 노드 생성을 이미지 필드로 POST fid하고 이미지 필드를 파일과 연결하는 데 사용하는 것입니다. 내가 당신을 이해한다면, 문제는 fid아무것도 반환되지 않을 때 를 결정하는 방법 입니다. Drupal 스레드에서 오늘 REST UI의 향후 버전이 전체 엔티티를 반환한다는 것을 알았지 만 지금은이 문제를 해결하는 방법을 잘 모르겠습니다.
Blake Frederick

1
  1. RestUi파일 엔티티 모듈을 설치하고 사용 하십시오 .
  2. 'admin / config / services / rest'로 이동하여 json 및 hal_json 형식과 함께 post 메소드를 사용하여 File Resource를 활성화하십시오.
  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_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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.