Comment télécharger un fichier dans des formulaires drupal8 avec un fichier de type d'élément de formulaire?

10

Je souhaite télécharger un fichier et je dois utiliser le type d'élément de formulaire comme «fichier». Dans la fonction de soumission, je ne peux pas obtenir de données appropriées concernant le fichier que je télécharge. Alors, quelqu'un peut-il m'aider à résoudre ce problème. Veuillez trouver le code ci-dessous:

public function buildForm(array $form, FormStateInterface $form_state) {
             $form['test_CERTIFICATE'] = [
                        '#type' => 'file',
                        '#title' => $this->t('Certificate'),
                        '#description' => $this->t('Your Certificate (.pem file)').': '.\Drupal::state()->get('test_CERTIFICATE_NAME'),           
                      ];
     return parent::buildForm($form, $form_state);

}

Soumettre la fonction:

  public function submitForm(array &$form, FormStateInterface $form_state) {
            parent::submitForm($form, $form_state);

            $validators = array('file_validate_extensions' => array('pem'));
            $files = file_save_upload('test_CERTIFICATE', $validators, 'public://certfiles', FILE_EXISTS_REPLACE);
           $file = File::load($files[0]);
           if($file) {
               kint($files); exit;
              //here control is not coming
               $file->setPermanent();
               $file->save();
           }
    }
Suraj
la source
Référez-vous au référentiel github pour un formulaire personnalisé avec le téléchargement de fichiers. github.com/nitin-kawane/…
Nitin

Réponses:

10

J'ai eu le même problème avec l' fileélément de formulaire. Résolu cela en utilisant managed_fileet en fournissant l'emplacement de téléchargement et les validateurs dans l'élément de formulaire:

$form['test_CERTIFICATE'] = [
  '#type' => 'managed_file',
  '#title' => $this->t('Certificate'),
  '#upload_location' => 'private://certfiles',
  '#upload_validators' => [
    'file_validate_extensions' => ['pem'],
  ],
];

Puis en soumission:

use Drupal\file\Entity\File;

$form_file = $form_state->getValue('test_CERTIFICATE', 0);
if (isset($form_file[0]) && !empty($form_file[0])) {
  $file = File::load($form_file[0]);
  $file->setPermanent();
  $file->save();
}
4k4
la source
Salut, merci pour ta suggestion. même moi, j'ai réussi avec cette méthode. Mais ici, comment puis-je empêcher l'entrée de fichiers en double dans le dossier public. Pour cette raison, j'ai opté pour le type "fichier". en cela, nous pouvons le faire en utilisant file_save_upload so ..
Suraj
Le fichier temporaire est supprimé automatiquement, je pense par défaut dans les 6 heures. Si vous ne voulez pas attendre, vous pouvez le supprimer après avoir enregistré le fichier permanent.
4k4
Je ne parle pas de copain de fichier temporaire. si j'ai téléchargé le même fichier deux fois, cette fois-ci, il conserve les deux fichiers dans le dossier public en ajoutant un nombre aléatoire au dernier fichier. ce type de duplication est révélateur.
Suraj
Vous pouvez rechercher un fichier existant portant le même nom avant de rendre le fichier temporaire permanent.
4k4
7

Vous pouvez accéder aux données des fichiers téléchargés via le champ "fichier" en utilisant le code suivant (à partir de D8.5 core / modules / config / src / Form / ConfigImportForm.php)

$all_files = $this->getRequest()->files->get('files', []);
$file = $all_files['test_CERTIFICATE'];
$file_path = $file->getRealPath();
CamelCode
la source
J'adorerais connaître la raison du vote négatif. Inutilement complexe ou mauvaise pratique?
almcnicoll
2
Je crois que c'est un plus correct à la question, lorsque vous utilisez '#type' => 'file'c'est la façon d'obtenir le fichier.
andeersg
@almcnicoll La raison du downvote était qu'il n'y avait aucune raison d'entrer dans ce bas niveau de téléchargement de fichiers. C'est juste un mauvais conseil.
Adaddinsane
2
A voté. C'est le moyen le plus clair de télécharger des fichiers non gérés. Pour obtenir le nom de fichier d'origine, vous pouvez utiliser $file_name = $file->getClientOriginalName(), puis enregistrer le fichier à l'emplacement final via file_unmanaged_copy($file_path, "PATH/$file_name");.
Michal Gow
Merci d'avoir posté, CamelCode. Dans certaines implémentations avancées, ces informations sont utiles. A voté.
Tyler Fahey