web-dev-qa-db-fra.com

Comment ajouter par programme une image à partir d'une URL externe à l'aide d'un module multimédia?

Je souhaite ajouter par programme une image à partir d'une URL externe et demander au module de stocker et d'afficher une copie locale de l'image. Comment puis je faire ça? Normalement, je clique sur le bouton "sélectionner un média" lors de la création d'un nouveau nœud, mais je souhaite le faire via du code.

19
Matthew Hui

Ceci est une réponse partielle à votre question, car j'essaie de faire quelque chose de similaire mais avec du matériel vidéo.

Vous pouvez créer le nœud en tant que type de contenu, enregistrer le type de support dont vous avez besoin (consultez le code du support pour le mime/type et les fonctions que vous devez appeler). Vous devrez probablement définir un champ de ressource multimédia et utiliser le sélecteur de fichier multimédia dans le type de champ.

Cependant, le problème avec lequel je rencontre un problème est que le navigateur l'affiche dans le nœud créé, que je suis en train de résoudre.

MISE À JOUR

Avoir un peu avancé. Une fois que vous avez enregistré le fichier multimédia (à l'aide de l'API multimédia), associez l'ID de fichier à l'ID de nœud à l'aide de file_usage_add () . Vous devrez probablement également associer le fichier dans le champ ajouté lorsque vous avez créé le champ d'actif multimédia.

0
ipe

Assurez-vous que votre php.ini autorise allow_url_fopen. Ensuite, vous pouvez utiliser quelque chose comme ça dans votre module:

$image = file_get_contents('http://drupal.org/files/issues/druplicon_2.png'); // string
$file = file_save_data($image, 'public://druplicon.png',FILE_EXISTS_REPLACE);

Utilisez la fonction file_get_contents () de php

http://www.php.net/manual/en/function.file-get-contents.php

puis utilisez Drupal file_save_data () de l'API ()

http://api.drupal.org/api/drupal/includes--file.inc/function/file_save_data/7

Ensuite, vous devriez pouvoir l'appeler en utilisant et l'enregistrer sur un nœud, etc.

$node = new stdClass;
$node->type = 'node_type';
node_object_prepare($node);
$node->field_image[LANGUAGE_NONE]['0']['fid'] = $file->fid;
node_save($node);

Modifier:

Comme indiqué dans les commentaires, vous pouvez utiliser la fonction system_retrieve_file Voir: https://api.drupal.org/api/drupal/modules!system!system.module/function/system_retrieve_file/7

13
tecjam

Voici mon exemple de travail.

$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;
}
6
hugronaphor

Ce n'est pas une réponse directe, mais assurez-vous que vous connaissez déjà le module Filefield Sources , qui le fait pour les images en général. Il pourrait répondre à vos besoins par lui-même; Je ne sais pas si c'est utile avec Media.

1
rfay

En plus de la réponse @tecjam: vous devez utiliser drupal_http_request () au lieu de file_get_contents () , cela vous donne plus de contrôle sur processus. Mais au total, cette méthode fonctionne comme prévu.

0
Kirill Roskolii
// 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;
0
mrded