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();
}
}
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();
}
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();