REST ile Drupal 8'e dosya gönderme


9

Sorunsuz bir şekilde makale oluşturabilirim REST. Ancak dosyaların nasıl gönderileceğini anlayamıyorum.

Drupal 8'e nasıl dosya (resim) gönderebilirim REST?

Güncelleme:

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"

Resim yayınlama (varlık içeriği olmadan):

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

Nasıl oluşturulacağını bulamıyorum entity content.



POSTing dosyaları için birkaç engelleyici var gibi görünüyor. Biri dosyaların base64 kodlamasıdır ( drupal.org/node/1927648 düzeltme eki mevcuttur) ve diğeri Güncelleme Silme Sil ( drupal.org/node/2310307 düzeltme eki kullanılabilir) için REST bitiş noktası izinleridir . Bunlardan hiçbirini henüz test etmedim.
Queenvictoria

Yanıtlar:


4
  • Çekirdeğe yama uygulayın: https://www.drupal.org/node/1927648
  • Rest UI'yı kullanarak şunları yükleyin: drush dl restui-8.x-1.x
  • / Admin / config / services / rest adresine gidin ve Dosya'yı etkinleştirin /entity/file/{file}
  • / Admin / people / permissions altında gerekli tüm izinleri ayarlayın
  • Dosyalar klasörünün var olduğundan ve uygun izinlere sahip olduğundan emin olun
  • Komut aracı base64 kullanarak görüntüyü kodlama
  • POST to 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"}] }
    

    resim açıklamasını buraya girin


Bir dosyayı başarıyla yüklerken 201 alırsınız, ancak dosyanın bulunduğu yere ilişkin hiçbir şey döndürülmez. Dosyanın bir kimliğinin veya konumunun döndürülmesini beklerim. Yüklendikten sonra dosyaya nasıl başvurabiliriz?
Ronnie

EntityResource.phpDüzeltme ekini ve 117 hattını temel alarak değiştirdim , varlık kimliğini döndürdüm ve şimdi en azından bu şekilde bir referansım var:$response = new ResourceResponse(NULL, 201,['id' => $entity->id()]);
Ronnie

@Ronnie Cevaba dayanarak, dosyanın sitenizin dosya klasöründe olmasını beklerim.
Blake Frederick

1
@BlakeFrederick Veritabanındaki dosyaya bir referans kaydetmem gerekirse bu gerçekten bana yardımcı olmaz. Bu senaryoyu düşünün: Bir içerik türü görüntü alanım var. Bir görüntünün oluşturulduğunda bu düğümle ilişkilendirilmesi gerekir. Dosyayı yüklediğinizde, 201 dışında hiçbir şey döndürülmez ... bu düğümü görüntüye işaret etmek için ne veririm? Bu yüzden $entity->id()cevaba ekledim . Varlık kimliğini düğüme geçiriyorum ve şimdi düğüm görüntüyü biliyor
Ronnie

@Ronnie - Sadece kendim üzerinde çalışıyorum, ancak dosya başarıyla sunucuya iletildiğinde, Drupal'ın file_managedtablosuna karşılık gelen bir satır eklendiğini fark ettim . Bu satır benzersizdir fid. Bir sonraki adım, bir görüntü alanı ile yeni bir düğüm oluşturma POST fidve görüntü alanını dosya ile ilişkilendirmek için kullanmak olduğuna inanıyorum . Seni anlarsam, soru, fidhiçbir şeyin ne zaman geri gönderileceğini nasıl belirleyeceğidir . Bugün bir Drupal iş parçacığından, REST UI'nin gelecekteki sürümünün tam varlığı döndüreceğini fark ettim, ancak şimdilik bu sorunu nasıl çözeceğimi bilmiyorum.
Blake Frederick

1
  1. RestUi ve Dosya Varlığı modüllerini kurun ve etkinleştirin .
  2. 'Admin / config / services / rest' dosyasına gidin ve json ve hal_json formatlarıyla birlikte post yöntemiyle Dosya Kaynağını etkinleştirin
  3. Kayıt izinlerini etkinleştirme Dosya kaynağındaki POST erişimine @ admin / people / permissions
  4. URL gönder - http: //d8.local/entity/file? _Format = hal_json
  5. Aşağıdaki gönderi verilerinin biçimi (görüntü verileri için base64 kodlayıcı kullanın)

    { "_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. Yetkilendirmeyi ayarlayın, başlıklarda İçerik Türü. (Yetkilendirme: Temel xxxxxxxx İçerik Türü: application / hal + json)

  7. Aşağıdaki php curl kullanın

    $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. Git ve dosyayı buradan kontrol et - admin / content / files


0

Hangi uç noktaları kullanabileceğinizi görmek için REST UI modülünü kurabilirsiniz.

Drupal 8'in REST modülü için çok temel kullanıcı arayüzü.

Ayrıca, hangi kimlik doğrulama tarafından hangi kaynakların maruz kalacağını yapılandırmanıza izin verir.

Kullanıcı arayüzünün şu anda yanlış uç noktaları sağladığını lütfen unutmayın: - REST URI yolları standart yollara değiştirildi


UI uç noktasını dosya: / file / {id} için bekletin. Soruyu güncelledim.
user32063
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.