プログラムで外部URLから画像を追加し、モジュールに画像のローカルコピーを保存および表示させたい。どうやってやるの?通常、新しいノードを作成するときに[メディアの選択]ボタンをクリックしますが、コードで実行したいと思います。
これはあなたの質問に対する部分的な回答です。私は似たようなことをしようとしていますが、ビデオ素材を使っています。
ノードをコンテンツタイプとして作成し、必要なメディアタイプを保存できます(呼び出す必要のある関連するMIME /タイプと関数のメディアコードを確認してください)。マルチメディアアセットフィールドを設定し、フィールドタイプでメディアファイルセレクタを使用する必要があるでしょう。
私が問題を抱えているのは、作成中のノードでブラウザに表示させることですが、現在、この問題に取り組んでいます。
もう少し進んだ。 (メディアAPIを使用して)メディアファイルを保存したら、 file_usage_add() を使用してファイルIDをノードIDに関連付けます。また、メディアアセットフィールドを作成したときに追加したフィールドにファイルを関連付ける必要があります。
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
これが私の作業例です。
$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;
}
これは直接的な答えではありませんが、一般的に画像に対してこれを行う Filefield Sources モジュールについてすでに知っていることを確認してください。それ自体でニーズを満たす可能性があります。メディアでそれが役立つかどうかはわかりません。
@tecjamの回答に加えて、file_get_contents()の代わりに drupal_http_request() を使用する必要があります。処理する。しかし、全体としてこの方法は期待どおりに機能します。
// 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;