Программно сохранить изображение с внешнего URL - Drupal - PullRequest
1 голос
/ 31 января 2012

Я пытаюсь создать узел, используя last.fm.

$field = content_fields('field_my_image',"events"); //to get field
$validators = array_merge(filefield_widget_upload_validators($field), imagefield_widget_upload_validators($field)); //image validator
$files_path = filefield_widget_file_path($field); //save path
$src_path=$data->image[3]; // img url from last.fm eg: http://userserve-ak.last.fm/serve/252/502025.jpg
$file = field_file_save_file($src_path, $validators, $files_path, FILE_EXISTS_REPLACE);//save file
$nodenew->field_my_image = array(
                array(
                    'fid' => $file['fid'],
                    'title' => $file['filename'],
                    'filename' => $file['filename'],
                    'filepath' => $file['filepath'],
                    'filesize' => $file['filesize'],
                    'filemime' => $file['filemime'],
 ),
);//insert file details to node

Теперь узел создан, но без изображения и получения сообщения 'Выбранный файл 502025.jpg не может быть сохранен. Файл не известен в формате изображения. '

Ответы [ 3 ]

7 голосов
/ 14 июня 2012

Drupal 7 предоставляет функцию для большей части того, что вы делаете: system_retrieve_file ().

Должна быть функция файлового модуля для сохранения файла в Drupal на основе URL, но по крайней мере эта функциядействительно существует ... просто не там, где кто-то будет искать.Вы можете использовать system_retrieve_file () с третьим параметром TRUE, чтобы создать управляемый файл (вызывая file_save_data ()).

Использование, более простой пример, чем у Jav_Rock, но практически такой же, просто пропуская причудливость пути хеширования:

  $url = 'http://example.com/picture.png';
  $directory = file_build_uri('custom_directory');
  if (!file_prepare_directory($directory, FILE_CREATE_DIRECTORY)) {
    // If our directory doesn't exist and can't be created, use the default.
    $directory = NULL;
  }
  $file = system_retrieve_file($url, $directory, TRUE);
2 голосов
/ 31 июля 2012

обновление

Нашли решение.

Сначала нам нужно сохранить изображение в папку drupal, вызвав MODULENAME_save_image_local ($ url) в функции создания узла:

$src_path = MODULENAME_save_image_local($url);

добавить эту функцию:

function MODULENAME_save_image_local($url) {
  $hash = md5($url);
  $dir = file_create_path('lastfm');
  if (!file_check_directory($dir)) {
    mkdir($dir, 0775, FALSE);
  }
  $hash = md5($url);
  $cachepath = file_create_path('CUSTOMFOLDERNAME/'. $hash.'.jpg');
  if (!is_file($cachepath)) {
    $result = eventpig_lastfm_fetch($url, $cachepath);
    if (!$result) {
      //we couldn't get the file
      return drupal_not_found();
    }
  }
  return file_directory_path() .'/CUSTOMFOLDERNAME/'. $hash.'.jpg';
}
/**
 * Api function to fetch a url and save image locally
*/
function MODULENAME_fetch($url, $cachepath) {
  if (!$url) {
    return drupal_not_found();
  }
  $result = drupal_http_request($url);
  $code   = floor($result->code / 100) * 100;
  $types  = array('image/jpeg', 'image/png', 'image/gif');
  if ($result->data && $code != 400 && $code != 500 && in_array($result->Content-Type, $types)) {
    $src = file_save_data($result->data, $cachepath);
  }
  else  {
    return drupal_not_found();
  }
  return TRUE;
}
1 голос
/ 31 января 2012
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...