web-dev-qa-db-fra.com

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

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. SO 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();
           }
    }
10
Suraj

J'ai eu le même problème avec l'élément de formulaire file. Résolu cela en utilisant managed_file et 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();
}
8
4k4

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();
5
CamelCode