如何使用媒体模块以编程方式从外部URL添加图像?


20

我想以编程方式从外部URL添加图像,并让模块存储并显示图像的本地副本。我怎样才能做到这一点?通常,在创建新节点时,我会单击“选择媒体”按钮,但是我想通过代码来实现。

Answers:


0

这是对您问题的部分回答,因为我正在尝试通过视频材料进行类似的操作。

您可以将节点创建为内容类型,保存所需的媒体类型(浏览媒体代码以了解所需的相关mime /类型和函数)。您可能需要设置一个多媒体资产字段,并在字段类型中使用媒体文件选择器。

我遇到的问题是让浏览器在创建的节点中显示它,这是我目前正在研究的问题。

更新

还有一点。保存媒体文件(使用媒体API)后,请使用file_usage_add()将文件ID与节点ID 关联。您可能还需要关联创建媒体资产字段时添加的字段中的文件。


您不需要调用file_usage_add()。您只需要将文件添加到tecjam答案中所示的字段即可。
戴夫·里德

13

确保您的php.ini允许allow_url_fopen。然后,您可以在模块中使用以下代码:

$image = file_get_contents('http://drupal.org/files/issues/druplicon_2.png'); // string
$file = file_save_data($image, 'public://druplicon.png',FILE_EXISTS_REPLACE);

使用php的file_get_contents()函数

http://www.php.net/manual/zh/function.file-get-contents.php

然后使用Drupal API的file_save_data()

http://api.drupal.org/api/drupal/includes--file.inc/function/file_save_data/7

然后,您应该可以使用调用它并将其保存到节点等。

$node = new stdClass;
$node->type = 'node_type';
node_object_prepare($node);
$node->field_image[LANGUAGE_NONE]['0']['fid'] = $file->fid;
node_save($node);

编辑:

如评论中所指出的,可以使用函数system_retrieve_file参见:https ://api.drupal.org/api/drupal/modules!system!system.module/function/system_retrieve_file /7


8
实际上,对此有更好的API:system_retrieve_file() $file = system_retrieve_file('http://drupal.org/files/issues/druplicon_2.png', NULL, TRUE, FILE_EXISTS_RENAME);
Dave Reid

6

这是我的工作示例。

$remoteDocPath = 'http://drupal.org/files/issues/druplicon_2.png';
$doc = system_retrieve_file($remoteDocPath, NULL, FALSE, FILE_EXISTS_REPLACE);
$file = drupal_add_existing_file($doc);

$node = new stdClass;
$node->type = 'node_type';
node_object_prepare($node);
$node->field_image[LANGUAGE_NONE]['0']['fid'] = $file->fid;
node_save($node);

function drupal_add_existing_file($file_drupal_path, $uid = 1, $status = FILE_STATUS_PERMANENT) {
  $files = file_load_multiple(array(), array('uri' => $file_drupal_path));
  $file = reset($files);

  if (!$file) {
    $file = (object) array(
        'filename' => basename($file_drupal_path),
        'filepath' => $file_drupal_path,
        'filemime' => file_get_mimetype($file_drupal_path),
        'filesize' => filesize($file_drupal_path),
        'uid' => $uid,
        'status' => $status,
        'timestamp' => time(),
        'uri' => $file_drupal_path,
    );
    drupal_write_record('file_managed', $file);
  }
  return $file;
}

为什么要使用创建临时文件,system_retrieve_file()然后将其另存为永久文件FILE_STATUS_PERMANENT?我看不到您的自定义功能的重点吗?
mpdonadio

这样-我没有大文件的问题。
hugronaphor 2014年

1

这不是直接的答案,但是请确保您已经了解Filefield Sources模块,该模块通常对图像执行此操作。它可能会单独满足您的需求;我不知道它对Media是否有用。



0
// This is a PHP function to get a string representation of the image file.
$image = file_get_contents($path); 

// A stream wrapper path where you want this image to reside on your file system including the desired filename.
$destination = 'public://path/to/store/this/image/name.jpg'; 

$file = file_save_data($image, $destination, FILE_EXISTS_REPLACE);

if (is_object($file)) { // if you get back a Drupal $file object, everything went as expected so make the status permenant
  $file->status = 1;
  $file = file_save($file);
}

return $file;

是否有理由重新使用该方法system_retrieve_file()(这将为您完成所有工作,并避免file_get_contents()不可用的服务器出现问题)?
克莱夫(Clive)
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.