Как программно добавить изображение с внешнего URL с помощью медиа-модуля?

20

Я хочу программно добавить изображение с внешнего URL-адреса, сохранить модуль и отобразить локальную копию изображения. Как я могу это сделать? Обычно, я бы нажал кнопку «выбрать медиа» при создании нового узла, но я хочу сделать это с помощью кода.

Мэтью Хуэй
источник

Ответы:

0

Это частичный ответ на ваш вопрос, так как я пытаюсь сделать нечто подобное, но с видео материалом.

Вы можете создать узел как тип контента, сохранить необходимый вам тип медиа (посмотрите код медиа для соответствующего mime / типа и функций, которые вам нужно вызвать). Вам, вероятно, потребуется установить поле мультимедийного ресурса и использовать селектор медиа-файла в типе поля.

Проблема, с которой я сталкиваюсь, заключается в том, чтобы браузер отображал ее в созданном узле, но сейчас я работаю над этим.

ОБНОВИТЬ

Получив немного дальше. После того, как вы сохранили файл мультимедиа (используя медиа-API), свяжите идентификатор файла с идентификатором узла, используя file_usage_add () . Вероятно, вам также нужно будет связать файл в поле, добавленном при создании поля медиаресурса.

фе
источник
Вам не нужно вызывать 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/en/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.

tecjam
источник
8
На самом деле есть лучший API для этого: system_retrieve_file () $file = system_retrieve_file('http://drupal.org/files/issues/druplicon_2.png', NULL, TRUE, FILE_EXISTS_RENAME);
Дейв Рид,
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
1

Это не прямой ответ, но убедитесь, что вы уже знаете о модуле Filefield Sources , который делает это для изображений в целом. Это может удовлетворить ваши потребности самостоятельно; Я не знаю, полезно ли это со СМИ.

rfay
источник
0

В дополнение к ответу @tecjam: вы должны использовать drupal_http_request () вместо file_get_contents () , это дает вам больше контроля над процессом. Но в целом этот метод работает, как и ожидалось.

Кирилл Росколий
источник
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;
mrded
источник
Есть ли причина использовать этот метод более system_retrieve_file()(который делает все это для вас и избегает проблем с серверами, где file_get_contents()нет)?
Клайв