web-dev-qa-db-fra.com

Lire le contenu du fichier téléchargé avant de l'enregistrer

J'utilise hook_node_presave() pour construire un module (dont je suis nouveau) dans Drupal 7. Je suis capable de référencer champs via $node->field_foo[$node->language][0]['value'] (Que j'ai vu mentionné plusieurs fois ici dans Drupal Answers).

Ce type de contenu particulier sur lequel je travaille a la capacité de télécharger des fichiers. Je suis nouveau sur Drupal 7, mais j'ai remarqué que:

  1. Tout d'abord, l'utilisateur télécharge le fichier
  2. Ensuite, l'utilisateur enregistre le nœud (avec une référence au fichier)

Comment puis-je accéder au contenu de ce fichier après son téléchargement, avec hook_node_presave()?

7
user1706487

Le ['value'] la valeur se trouve généralement dans les champs qui ne stockent qu'un type de chose, comme un champ de texte. D'autres types de champs utilisent tout ce dont ils ont besoin - au cas par cas, le type de champ file aura un tableau de nombreuses valeurs:

$node->field_some_file_field_name['und'][0] = array(
  fid => 650, // The file ID, which is important and cool.
  display => 1, // Show the file when a user views the node.
  description => 'foo', 
  uid => 7, // The user ID who uploaded this file.
  filename => some_file.pdf, // The **original** filename.
  uri => public://some-dir/some_file.pdf, // The URI to access the actual file.
  filemime => application/pdf,
  filesize => 3067583,
  status => 1,
  timestamp => 1352331360,
);

Le FID est une bonne chose, car le file_managed table stocke les références aux fichiers (y compris toutes les informations ci-dessus) et une entité n'a besoin que de connaître le FID pour se joindre à cette table et obtenir toutes les métadonnées du fichier sans lire le fichier.

Pour lire le contenu du fichier, vous avez quelques options:

Je ne sais pas ce que vous entendez explicitement par "lire le contenu", mais un fichier_get_contents () littéral ressemblerait à ceci:

$filepath = drupal_realpath($node->field_some_file_field_name['und'][0]['uri']);
$file_contents = file_get_contents($filepath);

Si vous voulez vérifier le MIME ou la taille du fichier ou quelque chose comme ça, vous avez déjà ces données à votre disposition dans le tableau du champ.

Si vous pouvez élaborer sur la "lecture" du fichier et ce que vous aimeriez faire avant que le champ du fichier ne soit attaché au nœud, veuillez mettre à jour votre message et j'essaierai de mettre à jour cette réponse en conséquence. Il y a peut-être un autre meilleur endroit pour que votre travail se produise.

13
Charlie Schliesser