Answers:
这是对您问题的部分回答,因为我正在尝试通过视频材料进行类似的操作。
您可以将节点创建为内容类型,保存所需的媒体类型(浏览媒体代码以了解所需的相关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/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
$file = system_retrieve_file('http://drupal.org/files/issues/druplicon_2.png', NULL, TRUE, FILE_EXISTS_RENAME);
这是我的工作示例。
$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
?我看不到您的自定义功能的重点吗?
这不是直接的答案,但是请确保您已经了解Filefield Sources模块,该模块通常对图像执行此操作。它可能会单独满足您的需求;我不知道它对Media是否有用。
除了@tecjam答案:您应该使用drupal_http_request()而不是 file_get_contents(),它可以使您更好地控制过程。但总的来说,这种方法可以按预期工作。
// 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()
不可用的服务器出现问题)?