如何通过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



看起来有几个阻止发布文件的阻止程序。一种是文件的base64编码(提供drupal.org/node/1927648补丁),另一种是创建更新删除的REST端点权限(提供drupal.org/node/2310307补丁)。我还没有测试任何一个。
Queenvictoria 2014年

Answers:


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 /

    {"_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()]);
Ronnie

@Ronnie根据答案,我希望该文件位于您网站的文件夹中。
布莱克·弗雷德里克

1
@BlakeFrederick如果我需要在数据库中保存对该文件的引用,那并没有真正的帮助。考虑这种情况:我有一个内容类型图像字段。映像在创建时需要与该节点关联。当您上传文件时,除了201以外什么都不会返回...我该给那个节点指向图像什么?这就是为什么我$entity->id()在响应中添加。我将实体ID传递给该节点,现在该节点知道该图像
Ronnie

@Ronnie-我本人只是在解决这个问题,但是我注意到当文件成功传输到服务器时,会将相应的行添加到Drupal的file_managed表中。此行具有唯一性fid。我相信下一步是发布带有图像字段的新节点的创建,并使用fid将图像字段与文件相关联。如果您了解我的问题,那么问题是如何确定fid什么都没有返回。我今天从Drupal线程中注意到,REST UI的未来版本将返回完整的实体,但是我现在不确定如何解决此问题。
布莱克·弗雷德里克

1
  1. 安装并启用RestUi文件实体模块。
  2. 转到'admin / config / services / rest'并启用带有post方法的文件资源以及json和hal_json格式
  3. 启用发布权限在文件资源 @ admin / people / permissions 上访问POST
  4. 发布网址-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内容类型: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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.