Загрузите файл на сервер Drupal с внешнего URL-адреса
Я пытаюсь кэшировать на сервере изображения профилей, предоставляемые API Facebook Graph. До сих пор я безуспешно пытался найти путь к изображению, а затем позвонил:
$file = file_save_upload($big_pic_url, array(), $dest, FILE_EXISTS_RENAME);
Это возвращает NULL
каждый раз. Я попробовал несколько синтаксисов для пути назначения, а также для пути URL-адреса Pic, похоже, ничего не работает.
Я делаю это правильно? Может ли file_save_upload()
использовать внешнюю ссылку в качестве части своего аргумента?
2 answers
Вот решение, которое я недавно использовал для модуля Facebook. Установите путь к изображению в переменную $path
(т.Е. http://graph.facebook.com/username/picture ). Затем выполните следующие действия, чтобы сохранить его через управляемую файловую систему Drupal:
$image = file_get_contents($path); // this is a PHP function to get a string representation of the image file
$destination = 'public://path/to/store/this/image/name.jpg'; // a stream wrapper path where you want this image to reside on your file system including the desired filename
$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);
}
Это функция, которую я использую, и она работает.
function get_external_image($url) {
$external_image = file_get_contents($url);
$parsed_url = parse_url($url);
$name_dest = rand(1000,9999)."_". basename($parsed_url["path"]);
$file = file_save_data($external_image, 'public://'.$name_dest , FILE_EXISTS_REPLACE);
if (is_object($file) && file_exists($file->uri)) {
$file->status = 1;
$file = file_save($file);
drupal_write_record('file_usage', $file);
return (array) $file;
}
return null;
}
Это пример того, как его использовать.
// Load your node.
$node = node_load("9999");
// Assign your image.
$node->field_image[$node->language]['0'] = get_external_image("http://cdn.sstatic.net/drupal/img/logo.png");
// Save your node.
node_save($node);