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

20

Je veux ajouter par programme une image à partir d'une URL externe et faire stocker le module et 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.

Matthew Hui
la source

Réponses:

0

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 média dont vous avez besoin (consultez le code du média 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.

Le bit avec lequel je rencontre un problème est de faire en sorte que le navigateur l'affiche dans le nœud créé, sur lequel je travaille actuellement.

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.

ipe
la source
Vous n'avez pas besoin d'appeler file_usage_add (). Vous avez juste besoin d'ajouter le fichier à un champ comme indiqué dans la réponse de tecjam.
Dave Reid
13

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 file_save_data () de l'API Drupal

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);

Éditer:

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

tecjam
la source
8
En fait, il existe une meilleure API pour cela: system_retrieve_file () $file = system_retrieve_file('http://drupal.org/files/issues/druplicon_2.png', NULL, TRUE, FILE_EXISTS_RENAME);
Dave Reid
6

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;
}
hugronaphor
la source
Pourquoi créez-vous un fichier temporaire avec le system_retrieve_file()puis l'enregistrez-vous en tant que fichier permanent dans FILE_STATUS_PERMANENT? Je ne vois pas l'intérêt de votre fonction personnalisée?
mpdonadio
De cette façon - je n'ai pas de problèmes avec les gros fichiers.
hugronaphor
1

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.

rfay
la source
0

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 le processus. Mais au total, cette méthode fonctionne comme prévu.

Kirill Roskolii
la source
0
// 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;
mrded
la source
Y a-t-il une raison d'utiliser cette méthode system_retrieve_file()(ce qui fait tout pour vous et évite les problèmes avec les serveurs là où ils file_get_contents()ne sont pas disponibles)?
Clive