Cách gửi tệp đến Drupal 8 qua REST


9

Tôi có thể tạo bài viết thông qua RESTmà không có vấn đề. Nhưng tôi không thể tìm ra cách gửi tệp.

Làm cách nào để gửi tệp (hình ảnh) cho Drupal 8 qua REST?

Cập nhật:

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"

Đăng ảnh (không có nội dung thực thể):

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

Tôi không thể tìm ra cách tạo ra entity content.



Có vẻ như có một vài trình chặn cho các tệp POST. Một là mã hóa các tệp cơ sở64 ( bản vá drupal.org/node/1927648 có sẵn) và bản còn lại là các quyền của điểm cuối REST cho Tạo bản cập nhật Xóa ( bản vá drupal.org/node/2 310307 có sẵn). Tôi chưa thử nghiệm một trong hai thứ này.
Queenvictoria

Câu trả lời:


4
  • Áp dụng bản vá cho lõi: https://www.drupal.org/node/1927648
  • Cài đặt Rest UI bằng cách sử dụng: drush dl restui-8.x-1.x
  • Truy cập / admin / config / services / rest và kích hoạt File /entity/file/{file}
  • Trong / admin / people / quyền đặt tất cả các quyền cần thiết
  • Đảm bảo thư mục tệp tồn tại và có quyền thích hợp
  • Mã hóa hình ảnh bằng cách sử dụng công cụ lệnh base64
  • POST lên 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"}] }
    

    nhập mô tả hình ảnh ở đây


Khi tải lên tệp thành công, bạn nhận được một năm 201, nhưng không có gì được trả về liên quan đến vị trí của tệp. Tôi sẽ mong đợi một ID hoặc vị trí của tập tin sẽ được trả lại. Làm thế nào để chúng ta tham chiếu các tập tin một khi nó được tải lên?
Ronnie

Tôi đã sửa đổi EntityResource.phpdựa trên bản vá và dòng 117 của bạn, tôi đã trả lại ID thực thể và bây giờ tôi ít nhất có một tham chiếu đến nó theo cách đó:$response = new ResourceResponse(NULL, 201,['id' => $entity->id()]);
Ronnie

@Ronnie Dựa trên câu trả lời, tôi hy vọng tệp sẽ được đặt trong thư mục tệp của trang web của bạn.
Blake Frederick

1
@BlakeFrederick Điều đó không thực sự giúp tôi mặc dù tôi cần lưu một tham chiếu đến tệp trong cơ sở dữ liệu. Hãy nghĩ về kịch bản này: Tôi có một loại nội dung một trường hình ảnh. Một hình ảnh cần phải được liên kết với nút đó khi được tạo. Khi bạn tải lên tệp, không có gì được trả về ngoại trừ năm 201 ... tôi phải cung cấp nút nào để trỏ đến hình ảnh? Đó là lý do tại sao tôi thêm $entity->id()phản hồi. Tôi chuyển id thực thể cho nút và bây giờ nút đó biết về hình ảnh
Ronnie

@Ronnie - Tôi chỉ tự mình làm việc này, nhưng tôi nhận thấy rằng khi tệp được truyền thành công máy chủ, một hàng tương ứng sẽ được thêm vào file_managedbảng của Drupal . Hàng này có một duy nhất fid. Tôi tin rằng bước tiếp theo là POST tạo một nút mới với trường hình ảnh và sử dụng fidđể liên kết trường hình ảnh với tệp. Nếu tôi hiểu bạn, câu hỏi là làm thế nào để xác định fidkhi nào không có gì được trả lại. Tôi đã nhận thấy từ một luồng Drupal ngày hôm nay rằng phiên bản tương lai của giao diện người dùng REST sẽ trả về thực thể đầy đủ, nhưng tôi không chắc cách giải quyết vấn đề này cho đến bây giờ.
Blake Frederick

1
  1. Cài đặt và kích hoạt các mô đun RestUiFile Entity .
  2. Goto 'admin / config / services / rest' và bật File Resource với phương thức post cùng với các định dạng json và hal_json
  3. Cho phép bài đăng Truy cập POST trên Tài nguyên tệp @ admin / people / allow
  4. Đăng url - http: //d8.local/entity/file? _Format = hal_json
  5. Định dạng sau của dữ liệu bài đăng (sử dụng bộ mã hóa base64 cho dữ liệu hình ảnh)

    { "_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. Đặt Ủy quyền, Loại nội dung trong các tiêu đề. (Ủy quyền: Cơ bản xxxxxxxx Loại nội dung: application / hal + json)

  7. Sử dụng php curl sau

    $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. Đi và kiểm tra tệp ở đây - admin / content / files


0

Bạn có thể cài đặt mô-đun UI UI để xem bạn có thể sử dụng điểm cuối nào.

Giao diện người dùng rất cơ bản cho mô-đun REST của Drupal 8.

Vì nó cũng cho phép bạn định cấu hình tài nguyên nào được hiển thị bằng xác thực nào.

Xin lưu ý rằng UI hiện cung cấp các điểm cuối sai: - Đường dẫn URI REST đã thay đổi thành đường dẫn chính tắc


Điểm cuối UI còn lại cho tệp: / file / {id}. Tôi đã cập nhật câu hỏi.
dùng32063
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.