วิธีส่งไฟล์ไปที่ 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 หนึ่งคือการเข้ารหัส base64 ของไฟล์ (มีdrupal.org/node/1927648 patch) และอีกอันคือสิทธิ์ REST endpoint สำหรับสร้างการอัปเดตการลบ ( drupal.org/node/2310307 patch) ฉันยังไม่ได้ทดสอบอย่างใดอย่างหนึ่ง
Queenvictoria

คำตอบ:


4
  • ใช้โปรแกรมปะแก้กับ core: https://www.drupal.org/node/1927648
  • ติดตั้ง Rest UI โดยใช้: drush dl restui-8.x-1.x
  • ไปที่ / admin / config / services / rest และเปิดใช้งานไฟล์ /entity/file/{file}
  • ภายใต้ / admin / คน / การอนุญาตตั้งค่าการอนุญาตที่จำเป็นทั้งหมด
  • ตรวจสอบให้แน่ใจว่าโฟลเดอร์ไฟล์มีอยู่และมีสิทธิ์ที่เหมาะสม
  • เข้ารหัสภาพโดยใช้เครื่องมือคำสั่ง base64
  • โพสต์ถึง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 แต่จะไม่มีการส่งคืนใด ๆ เกี่ยวกับตำแหน่งของไฟล์ ฉันคาดหวังว่าจะส่งคืน ID หรือตำแหน่งของไฟล์ เราจะอ้างอิงไฟล์เมื่ออัพโหลดได้อย่างไร
Ronnie

ฉันปรับเปลี่ยนEntityResource.phpตามแพทช์และสาย 117 ของคุณฉันส่งคืนเอนทิตี ID และตอนนี้อย่างน้อยฉันก็มีการอ้างอิงถึงวิธีการนั้น:$response = new ResourceResponse(NULL, 201,['id' => $entity->id()]);
Ronnie

@Ronnie ตามคำตอบฉันคาดว่าไฟล์จะอยู่ในโฟลเดอร์ไฟล์ของเว็บไซต์ของคุณ
Blake Frederick

1
@BlakeFrederick นั่นไม่ได้ช่วยฉันจริงๆแม้ว่าฉันจะต้องบันทึกการอ้างอิงไปยังไฟล์ในฐานข้อมูล นึกถึงสถานการณ์นี้: ฉันมีประเภทเนื้อหาที่เป็นช่องภาพ รูปภาพต้องเชื่อมโยงกับโหนดนั้นเมื่อสร้างขึ้น เมื่อคุณอัปโหลดไฟล์จะไม่มีสิ่งใดส่งคืนยกเว้น 201 ... ฉันจะให้โหนดนั้นชี้ไปที่รูปภาพอย่างไร นั่นคือเหตุผลที่ฉันเพิ่ม$entity->id()การตอบกลับ ฉันส่งรหัสเอนทิตีไปยังโหนดและตอนนี้โหนดทราบเกี่ยวกับรูปภาพ
Ronnie

@ Ronnie - ฉันแค่ทำงานด้วยตัวเอง แต่ฉันสังเกตว่าเมื่อไฟล์ถูกส่งสำเร็จเซิร์ฟเวอร์แถวที่เกี่ยวข้องจะถูกเพิ่มเข้าไปในfile_managedตารางของ Drupal fidแถวนี้มีที่ไม่ซ้ำกัน ฉันเชื่อว่าขั้นตอนต่อไปคือการโพสต์การสร้างโหนดใหม่กับเขตข้อมูลภาพและใช้fidเพื่อเชื่อมโยงเขตข้อมูลภาพกับไฟล์ ถ้าฉันเข้าใจคุณคำถามก็คือจะตัดสินได้อย่างไรว่าfidเมื่อใดที่ไม่มีการส่งคืน ฉันสังเกตเห็นจากเธรด Drupal วันนี้ว่า REST UI เวอร์ชันในอนาคตจะคืนเอนทิตีแบบเต็ม แต่ฉันไม่แน่ใจว่าจะแก้ปัญหานี้ได้อย่างไรในตอนนี้
Blake Frederick

1
  1. ติดตั้งและเปิดใช้งานRestUiและไฟล์ Entityโมดูล
  2. ไปที่ 'admin / config / services / rest' และเปิดใช้งานทรัพยากรไฟล์ด้วยวิธีการโพสต์พร้อมกับรูปแบบ json และ hal_json
  3. เปิดใช้งานโพสต์สิทธิ์เข้าถึง POST บนทรัพยากรไฟล์ @ admin / คน / สิทธิ์
  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 เนื้อหาประเภท: แอปพลิเคชัน / 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

ในขณะที่มันยังช่วยให้คุณกำหนดค่าทรัพยากรที่จะเปิดเผยโดยการตรวจสอบใด

โปรดทราบว่าปัจจุบัน UI มีจุดปลายผิด: - เส้นทาง REST URI เปลี่ยนเป็นเส้นทางแบบบัญญัติ


Rest UI endpoint สำหรับไฟล์: / file / {id} ฉันได้อัปเดตคำถามแล้ว
user32063
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.