web-dev-qa-db-fra.com

Impossible de récupérer le fichier téléchargé dans le gestionnaire de soumission

Je crée un formulaire personnalisé avec un champ de téléchargement de fichier dont le contenu sera lu, traité puis envoyé à une API externe. Le problème est à chaque fois que je télécharge le fichier, le champ car il semble être vide dans le gestionnaire de soumission et je ne vois pas pourquoi.

Dans cet exemple, je l'utilise comme un fichier non géré car je n'ai besoin que de le traiter puis de le supprimer, mais je l'ai essayé en tant que fichier géré qui télécharge (je peux le voir dans le répertoire) et a le fichier ajouté au table de base de données gérée par fichier. Je ne sais pas où les fichiers non gérés doivent aller pour vérifier leur téléchargement.

public function buildForm(array $form, FormStateInterface $form_state) {
    $form = [
      '#attributes' => ['enctype' => 'multipart/form-data'],
    ];

    $form['file_upload_details'] = [
      '#markup' => "<strong>" . $this->t('The KML File') . "</strong>",
    ];

    $form['my_file'] = [
      '#type' => 'file',
      '#description' => $this->t('KML format only'),
      '#upload_location' => 'public://my_files/',
      '#upload_validators' => [
        'file_validate_extensions' => ['kml'],
      ],
    ];

    $form_build = parent::buildForm($form, $form_state);

    return $form_build;
  }
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $messenger = parent::messenger();

var_dump(
  $form_state->getStorage(), // Empty array
  $form_state->getValue('my_file') // Empty string
);
  }
3
Neil Nand

Tout ce que font les éléments du formulaire '#type' => 'file', C'est de fournir un élément <input type="file"> Nu. Vous obtenez une invite pour sélectionner un fichier sur votre machine et sur formulaire soumettez le navigateur envoie une demande à votre serveur, le serveur la transmet à PHP, PHP extrait le fichier de la demande, PHP le stocke dans le répertoire temporaire du serveur et lorsque le script se termine, il le supprime à nouveau. Pas beaucoup Drupal impliqué.

Si vous devez gérer le fichier d'une manière ou d'une autre et que ce soit juste le nom de fichier, vous devez vous en occuper vous-même. Et c'est à cela que sert file_save_upload() . Il attend le $form_field_name Comme premier paramètre. Et il vous renverra les informations sur le fichier. Lors de l'analyse du noyau pour '#type' => 'file', Vous verrez souvent cette fonction utilisée dans le gestionnaire de validation de formulaire. Où la valeur de retour est renvoyée à $form_state. Par exemple dans \Drupal\system\Form\ThemeSettingsForm::validateForm() . Juste cette fois, la fonction est enveloppée de _file_save_upload_from_form() pour permettre une gestion correcte des erreurs dans les formulaires.

// Check for a new uploaded logo.
if (isset($form['logo'])) {
  $file = _file_save_upload_from_form($form['logo']['settings']['logo_upload'], $form_state, 0);
  if ($file) {
    // Put the temporary file in form_values so we can save it on submit.
    $form_state->setValue('logo_upload', $file);
  }
}
2
leymannx

J'ai un module personnalisé pour importer CSV. Cela fonctionne pour moi.

$form['#attributes'] = [
  'enctype' => 'multipart/form-data',
  'class' => ['csv-import-form', 'mb-50'],
];

$form['csv_file'] = [
  '#type' => 'file',
  '#title' => t('CSV File'),
  '#description' => $this->t('Upload file here.'),
  '#element_validate' => ['::csv_import_validate_file_upload'],
];

public static function csv_import_validate_file_upload(&$element, FormStateInterface $form_state, &$complete_form) {

$validators = [
  'file_validate_extensions' => ['csv CSV'],
];

if ($file = file_save_upload('csv_file', $validators, FALSE, 0, \Drupal\Core\File\FileSystemInterface::EXISTS_REPLACE)) {

  $csv_dir          = 'public://my_files/';
  $directory_exists = \Drupal::service('file_system')->prepareDirectory($csv_dir);

  if(!$directory_exists){
    \Drupal::service('file_system')->prepareDirectory($csv_dir, \Drupal\Core\File\FileSystemInterface::CREATE_DIRECTORY);
  }

  if ($directory_exists) {
    $destination = $csv_dir . '/' . $file->getFilename();

    if (file_copy($file, $destination, \Drupal\Core\File\FileSystemInterface::EXISTS_REPLACE)) {
      $form_state->setValue('csv_file', $destination);
    }
    else {
      $form_state->setErrorByName('csv_file', t('Unable to copy upload file to @dest', ['@dest' => $destination]));
    }
  }
}}



public function submitForm(array &$form, FormStateInterface $form_state) {
    $csv_uri = $form_state->getValue('csv_upload', FALSE);

if ($csv_uri) {
  $csv_data = processCsv($csv_uri);

  if (count($csv_data)) {
    $batch = $this->generateBatchImport($csv_data);
    batch_set($batch);

    $form_state->setRedirect('view.users.page_1');
  }
}}
1
STF