web-dev-qa-db-fra.com

Comment renommer un fichier téléchargé à l'aide de l'API de formulaire et du champ Drupal managed_file

Je fais un Drupal formulaire en utilisant FAPI (Drupal 7) dans ce formulaire, j'ai utilisé le champ managed_file

$form['image_fid'] = array(
  '#title' => t('Image'),
  '#type' => 'managed_file',
  '#upload_location' => 'public://',
);

Je veux renommer le fichier téléchargé (faire le nom de fichier = nom de fichier + date)

Comment puis-je faire quelque chose comme ça

6
Ahmed

En supposant que vous connaissiez l'état du fichier, file_save & file_usage_add.

Dans votre rappel de soumission:

$file = file_load($form_state['values']['image_fid']);
$file->filename = 'somefilename';
$file->status = FILE_STATUS_PERMANENT;
file_save($file);
file_usage_add($file, 'yourmodule', 'foo', 1);

Plus d'informations sur le Form API Reference .

4
Bart

La meilleure façon de renommer un fichier est d'utiliser le module https://www.drupal.org/project/filefield_paths .

Le module File (Field) Paths étend les fonctionnalités par défaut du module File de Drupal, du module Image et de nombreux autres modules de téléchargement de fichiers, en ajoutant la possibilité d'utiliser des jetons basés sur des entités dans les chemins de destination et les noms de fichiers.

En termes simples, File (Field) Paths vous permet de trier et de renommer automatiquement vos fichiers téléchargés en utilisant des modèles de remplacement basés sur des jetons pour maintenir un système de fichiers propre et agréable.

vous pouvez également le renommer par programme avec hook_file_insert

quelque chose comme

function hook_file_insert($file)
{
    $parts = pathinfo($file->filename);
    if (in_array(mb_strtolower($parts['extension']), array('jpg', 'jpeg', 'gif', 'png', 'tif', 'flv', 'pdf'))) {
        $uri = 'public://' . 'dsfr_' . $file->uid . '_' . $file->timestamp . '.' . $parts['extension'];
        $file = file_move($file, $uri);
    }
}
2
Yusef

Vous pouvez renommer le fichier sur le contexte de téléchargement via les fonctions de validation

voici le code édité

$form['image_fid'] = array(
  '#title' => t('Image'),
  '#type' => 'managed_file',
  '#upload_location' => 'public://',
  '#upload_validators'=>  array('file_validate_name' => array()),
);

function file_validate_name(stdClass $file) {
  $errors = array();

  //generate file name 
  $new_filename = convert_filename_to_filename_date($file->filename);


  $file->filename = $new_filename;

  //changing file location 
  $destination_dir = "public://file_location/";

  //check if file exists. if exists rename it append incremental number  until the filename is unique

  $file->destination = file_destination($destination_dir.$file->filename, FILE_EXISTS_RENAME);

  // If file_destination() returns FALSE then $replace == FILE_EXISTS_ERROR and
  // there's an existing file so we need to bail.
  if ($file->destination === FALSE) {
    $errors[] = t('The file %source could not be uploaded because a file by that name already exists in the destination %directory.',
    array('%source' => $file->source, '%directory' => $destination_dir));
  }

  return $errors;
}
2
amard

Je lutte avec cela depuis quelques jours, mais cela semble fonctionner pour ce que je voulais faire:

https://api.drupal.org/api/drupal/includes!file.inc/function/file_move/7

0
coranda