it-swarm.com.de

Hochgeladene Datei im Submit-Handler kann nicht abgerufen werden

Ich erstelle ein benutzerdefiniertes Formular mit einem Datei-Upload-Feld, dessen Inhalt gelesen, verarbeitet und dann an eine externe API gesendet wird. Das Problem ist, dass beim Hochladen der Datei das Feld im Submit-Handler leer zu sein scheint und ich nicht verstehen kann, warum.

In diesem Beispiel verwende ich es als nicht verwaltete Datei, da ich es nur verarbeiten und dann entfernen muss. Ich habe es jedoch als verwaltete Datei versucht, die hochgeladen wird (ich kann es im Verzeichnis sehen) und die Datei zur Datei hinzugefügt hat file_managed-Datenbanktabelle. Ich bin nicht sicher, wohin nicht verwaltete Dateien gehen sollen, um nach ihrem Upload zu suchen.

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

Alles, was '#type' => 'file' Formularelemente tun, ist, ein nacktes <input type="file"> Element bereitzustellen. Sie erhalten eine Aufforderung, eine Datei von Ihrem Computer auszuwählen, und beim Senden des Formulars sendet der Browser eine Anfrage an Ihren Server. Der Server leitet sie an PHP weiter. PHP extrahiert die Datei aus der Anfrage, PHP speichert es im temporären Verzeichnis des Servers und wenn das Skript endet, wird es erneut gelöscht. Nicht viel Drupal beteiligt.

Wenn Sie die Datei irgendwie handhaben müssen und es nur der Dateiname ist, müssen Sie sich selbst darum kümmern. Und dafür ist file_save_upload() da. Es erwartet den $form_field_name Als ersten Parameter. Und es gibt Ihnen die Dateiinformationen zurück. Beim Scannen des Kerns nach '#type' => 'file' Wird diese Funktion häufig im Formularüberprüfungshandler verwendet. Wo der Rückgabewert an $form_state Zurückgegeben wird. Zum Beispiel in \Drupal\system\Form\ThemeSettingsForm::validateForm() . Nur dieses Mal wird die Funktion von _file_save_upload_from_form() umbrochen, um eine korrekte Fehlerbehandlung in Formularen zu ermöglichen.

// 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

Ich habe ein benutzerdefiniertes Modul zum Importieren von CSV. Das funktioniert bei mir.

$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