Download een bestand en sla dit op

Drupal 7.

Wil je een bestand downloaden en als node opslaan? Hieronder staat de universele Drupel 7 functies hiervoor. Eventuele directories worden automatisch aangemaakt.

Het bestaat uit twee functies. De eerste download het bestand. De tweede slaat het op als node.

/**
 * param string $url
 * De volledige url van het te downloaden bestand
 * param string $uri
 * Drupal uri waar het bestand moet worden opgeslagen, voorbeeld: public://archive/test.pdf
 * param int $save_mode
 * Bestands save mode voor drupal core, voorbeeld: FILE_EXISTS_REPLACE
*/
function download_extern_bestand($url, $uri, $save_mode = FILE_EXISTS_RENAME) {
  $url_info = parse_url($url);
  $url_path_info = pathinfo($url_info['path']);
  $url = $url_info['scheme'] . '://' . $url_info['host'] . $url_path_info['dirname'] .'/'. rawurlencode($url_path_info['basename']);
 
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
  $file = curl_exec($ch);
  curl_close($ch);
 
  if ($file !== FALSE) {
    //create directory first
    $uri_info = pathinfo($uri);
    @drupal_mkdir($uri_info['dirname'], NULL, TRUE);
    $new_file = file_save_data($file, $uri, $save_mode);
    if (!$new_file) {
      return FALSE;
    }
    $new_file->display = 1;
    return (array)$new_file;
  }
else {
    drupal_set_message("Could not download file " . $url, 'error');
    return FALSE;
  }
}

Neem vervolgens in een module het volgende stukje code op:

  $uri = 'public://jou_directory/nieuw_1/naam.txt';
  $new_file = download_extern_bestand('http://www.example.com/download_bestandsnaam.txt', $uri, FILE_EXISTS_REPLACE);
  if ($new_file) {
    $node->naam_van_mijn_filefield[X][] = $new_file;
    node_save($node);
  }
  else {
    drupal_set_message("Download failed");
  }