web-dev-qa-db-fra.com

Le téléchargement de sauvegarde de fichier ne remplace pas le fichier existant malgré FILE_EXISTS_REPLACE

J'essaie de forcer le remplacement du fichier existant du même nom, si une nouvelle version est téléchargée par l'utilisateur. J'ai vu beaucoup de messages sur ce sujet, mais aucun que j'ai pu trouver n'adresse comment forcer le remplacement.

J'utilise un formulaire personnalisé, et voici le code que j'ai essayé de faire fonctionner pendant la validation du formulaire:

  $file = file_save_upload(
      'file', 
      array(
        'file_validate_is_document' => array(), // Validates file is really a document.
        'file_validate_extensions' => array('pdf doc ppt pps avi mpg mov wmv'), // Validate extensions.
      ),
      'public://',
      FILE_EXISTS_REPLACE
  );

Le fichier révisé (disons "file.jpg") est téléchargé, mais inévitablement Drupal crée une nouvelle copie et la renomme file_0.jpg, file_1.jpg, etc. pour chaque nouvelle version.

J'ai même essayé de supprimer par programme le fichier d'origine en utilisant "file_delete" avant de valider le téléchargement mais j'obtiens toujours la copie!

Toute aide serait appréciée.

7
longboardnode

Il s'agit du comportement par défaut de Drupal et d'un problème connu. Il a été abordé de deux manières.

Le module pload File Replace résout ce problème en échangeant les noms de fichiers afin que le nouveau fichier conserve le nom d'origine.

Le module Media Update permet le remplacement in situ de fichiers multimédias (faisant partie du projet Media ).

Vous pouvez soit utiliser l'un de ces modules, soit les utiliser comme modèle pour votre propre fonction.

5
Triskelion

J'ai réussi à le faire fonctionner en utilisant le code suivant.

$file = file_save_upload('file', $validators);
// If the file passed validation:
if ($file) {
    // I PLACED IT IN THE NEXT LINE
    if ($file = file_move($file, 'public://', FILE_EXISTS_REPLACE)) {
        // Save the file for use in the submit handler.
        $form_state['storage']['file'] = $file;
    } else {
        form_set_error('file', t('Failed to write the uploaded file to the site\'s file folder.'));
    }
} else {
    form_set_error('file', t('No file was uploaded.'));
}
0
Ngatia Frankline