如何使用服务3保存图像


8

我发现了一些有关Services 3的非常详细的教程。非常感谢他们,这里是一小部分。

http://drupal.org/node/1354202

如何使用node.save服务将多个图像添加到节点?

http://drupal.org/node/1699354

但是我找不到一种将图像从移动应用程序上传到服务器的方法。那可能吗 ?我在哪里可以得到一些例子?

服务核心中是否可以完成此任务?每个解决方案似乎都需要我编写一些代码才能使其正常工作。


检查这个要点
穆罕默德·雷达

Answers:


6

我曾经有这样的要求,在其中,我必须使用Web服务创建一个还将保存图像的节点。以下代码使用Web服务上载并保存图像。

// File validator.
$validators = array(
  /**
   * Defaults already allow png, jpg etc. If more needed to be supported,
   * edit here.
   */
  'file_validate_extensions' => array(),
  'file_validate_size' => array(),
);


foreach ($_FILES['files']['name'] as $field_name => $file_name) {
  // Save the file and get file object.
    $file = file_save_upload($field_name, $validators, file_default_scheme() . "://");

  // Check whether image is uploaded.
  if ($file->fid) {
    $node = new stdClass();
    $node->type = 'CONTENT_TYPE';
    $node->title = 'TITLE';
    $node->language = LANGUAGE_NONE;
    $node->uid = 'USER_UID';
    node_object_prepare($node);

    $node->field_custom[$node->language][0]['value'] = 'SOME_VALUE';
    // File upload here..
    $node->field_image[$node->language][0] = (array)$file;

    $node = node_submit($node);
    node_save($node);
  }
  else {                                                                      
    return services_error(t('File upload failed'), 406, t('File upload failed'));
  }
}

注意:以下代码已使用服务3进行了测试。这也是一个iOS应用程序,正在使用此Web服务,并且在那里工作。

注意:通过POST请求上传的文件。

我使用名为REST Console的Google Chrome插件测试了上述代码。要在Chrome网上应用店中搜索“ rest console”安装插件并安装第一个插件,您将获得结果(绿色向上和蓝色向下箭头)

希望这可以帮助!


1
谢谢,您的意思是“服务”核心中没有什么可以实现这一目标的?
niksmac

没看过..您可能会看到服务模块的api.php文件
subhojit777

drupal.org/files/endpoint_resources.png这里的资源类型类似于“文件”。
niksmac

对不起。我参加了资源的编码/ file_resource.inc的帮助下,上传图片使用Web服务。我忘了提,其以来我创建的Web服务很长一段时间
subhojit777

我可以建议的一件事是,您可以从Web服务回调中以编程方式调用Web服务并获取$ file数组..但这不是重载吗?调用Web服务中的另一个Web服务
subhojit777

3

首先,请确保在您的端点中启用了文件->创建资源。

在“客户端”中,我做了这样的事情:

/**
 * Upload a file using services 3.X
 * 
 * @param the path of the local file
 * @return bool|int the fid of the file.
 *
 * 
 * With the fid you can attach this file in the node object before to be send.
 * ej.
 * $node->title = 'My remote node';
 * $fid = node_upload_image('/The_path/to_the/local_file.jpg');
 * $node->file_field[0] = array( 
 *    'fid' => $fid,
 *    'list' => 1,
 *    'data' => array()
 * );
 * // Other fields related with the node.
 * ...
 * 
 * // Sending the node.
 * $data = http_build_query($node, '', '&');
 * $response = drupal_http_request('myremotesite.com'. '/node', array(
 *   'Accept' => 'application/json', 
 *   'Cookie' => 'auth_cookie_info'
 * ), 'POST', $data);
 *
 * Done. 
 */
function node_upload_image($image_path) {
  $file = array(
    'filesize' => filesize($image_path),
    'filename' => basename($image_path),
    'file' => base64_encode(file_get_contents($image_path)),
    'uid'  => 1  // This should change it by the user who use the service.
  );

  $data = http_build_query($file, '', '&');
  $response = drupal_http_request('myremotesite.com/myservice-endpoint' . "/file", array('Accept' => 'application/json', 'Cookie' => 'auth_cookie_info'), "POST", $data);


  if ($response->code == 200) {
    return json_decode($response->data)->fid;
  }


  $this->error =  $response->status_message; 
  return false;
}

我是从另一个Drupal那里做到的,并且对于Drupal 6来说,将代码移植到D7应该很容易,我认为您已经知道了如何做。


2

常规服务3具有“文件”端点。您只需启用文件创建并发布类似的内容即可;该文件本身是base-64编码的:

{
    "filename": "user993.jpg",
    "target_uri": "pictures/user993.jpg",
    "filemime": "image/jpeg",
    "file": "/9j/4AAQSkZJRgABAQELIiyoy0pUQRoFjAVVGAAMACiigBaKKKAP/2Q==...",
    "filesize": "5356"
}

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.