web-dev-qa-db-fra.com

comment renommer un fichier avant / après le téléchargement

Je veux renommer un fichier téléchargé. J'ai le code suivant. J'ai défini un gestionnaire de soumission pour ce faire.

function example_form_submit(&$form, FormStateInterface $form_state) {
    if ($form_state->hasFileElement()) {

        $video_file_file_array = $form_state->getValue('field_video_file');        
        if (is_array($video_file_file_array)) {
            if (isset($video_file_file_array[0])) {
                $video_file_file_id = $video_file_file_array[0]['fids'][0];
                if($video_file_file_id){
                    $file = \Drupal\file\Entity\File::load($video_file_file_id);
                    $file->set('filename', 'something');
                    $file->save();

                }                
            }
        }
    }
}

Ça ne marche pas. Est-ce qu'il y a un autre moyen.

3
Dushyant Joshi

Votre implémentation devrait fonctionner. Je soupçonne que pour une raison ou une autre, l'exécution ne remplit pas toutes les conditions que vous avez là-bas, ce qui semble un peu bizarre. Voici un exemple de mon projet:

$fid = $form_state->getValue(['field_video_file', 0]);
if (!$form_state->getErrors() && !empty($fid)) {
  try {
    $file = \Drupal\file\Entity\File::load($fid);
    $file->setFilename('smth');
    $file->save();
  }
  catch (\Exception $e) {
    watchdog_exception('myerror', $e);
  }
}
2
hugronaphor

Renommer l'entité de fichier en Drupal 8 peut être réalisé comme ceci:

    $file = File::load($file_target_id);
    $new_filename = "filename.png";
    $stream_wrapper = \Drupal::service('file_system')->uriScheme($file->getFileUri());
    $new_filename_uri = "{$stream_wrapper}://{$new_filename}";
    file_move($file, $new_filename_uri);

Comme vous pouvez le voir dans cet exemple Drupal file_move la fonction est utilisée ici qui s'occupe de tout. Il vous suffit de connaître le fichier target_id qui est le fichier fid.

2
bpile

J'ai dû permettre aux utilisateurs de télécharger un fichier, puis de le renommer et d'effacer l'existant du même nom. D'une manière à n'avoir toujours que sur fichier sur le dossier qui ont toujours le même chemin.

J'essaie $file->setFilename et $file->setFileUri mais ceux-ci ne changent que le nom et l'URL pour Drupal (dans la base de données) mais pas le vrai nom de fichier (sur le serveur). C'est pourquoi j'ai dû ajouter un morceau de code spécifique à renommer en utilisant la fonction drupal/php.

Peut-être que je ne devrais pas avoir à le faire à cause d'une mauvaise configuration mais cela fonctionne pour moi.

// In this variable you will have file entity 
$file = \Drupal::entityTypeManager()->getStorage('file')
    ->load($form_state->getValue('csv_file')[0]);
if (!$file)
  return;

$exUri  = explode('/', $file->getFileUri());
array_pop($exUri);
$rename = file_unmanaged_move($file->getFileUri(), implode('/', $exUri) . '/' . self::FILE_NAME . '.csv', FILE_EXISTS_REPLACE);

if ($rename) { ... }

Si vous souhaitez également modifier l'URI et le nom du fichier pour le laisser Drupal le savoir, ajoutez simplement ces lignes:

$file->setFilename(self::FILE_NAME);
$file->setFileUri(self::FILE_URI . self::FILE_NAME . '.csv');
$file->save();

Dans mon cas, je n'en avais pas besoin.

0
Pauleau