Wie lade ich eine Datei in drupal8-Formularen mit einer Datei vom Typ Formularelement hoch?

10

Ich möchte eine Datei hochladen und muss den Formularelementtyp als 'Datei' verwenden. In der Übermittlungsfunktion kann ich keine richtigen Daten zu der Datei abrufen, die ich hochlade. SO Kann mir bitte jemand helfen, dieses Problem zu lösen? Bitte finden Sie den folgenden Code:

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

}

Übermittlungsfunktion:

  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
quelle

Antworten:

8

Ich hatte das gleiche Problem mit dem fileFormularelement. Dies wurde behoben, managed_fileindem der Upload-Speicherort und die Validatoren im Formularelement verwendet und bereitgestellt wurden:

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

Dann senden Sie:

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
quelle
Hallo, danke für deinen Vorschlag. Sogar ich hatte Erfolg mit dieser Methode. Aber wie kann ich hier die Eingabe doppelter Dateien in den öffentlichen Ordner verhindern? Aus diesem Grund habe ich mich für den Dateityp entschieden. in diesem können wir tun, indem wir file_save_upload so verwenden ..
Suraj
Die temporäre Datei wird automatisch gelöscht, ich denke standardmäßig innerhalb von 6 Stunden. Wenn Sie nicht warten möchten, können Sie es löschen, nachdem Sie die permanente Datei gespeichert haben.
4k4
Ich erzähle nicht über temporäre Datei Kumpel. Wenn ich dieselbe Datei zweimal hochgeladen habe, werden diesmal beide Dateien im öffentlichen Ordner gespeichert, indem eine Zufallszahl an die neueste Datei angehängt wird. Diese Art der Vervielfältigung ist bezeichnend.
Suraj
Sie können nach einer vorhandenen Datei mit demselben Namen suchen, bevor Sie die temporäre Datei dauerhaft machen.
4k4
5

Sie können mit dem folgenden Code (aus D8.5 core / modules / config / src / Form / ConfigImportForm.php) auf über das Feld "Datei" hochgeladene Dateidaten zugreifen.

$all_files = $this->getRequest()->files->get('files', []);
$file = $all_files['test_CERTIFICATE'];
$file_path = $file->getRealPath();
CamelCode
quelle
Würde gerne den Grund für die Ablehnung kennen. Unnötig komplex oder schlechte Praxis?
Almcnicoll
2
Ich glaube, dies ist korrekter für die Frage, wenn Sie '#type' => 'file'dies verwenden, ist dies der Weg, um die Datei zu erhalten.
andeersg
@almcnicoll Der Grund für die Ablehnung war, dass es keinen Grund gibt, sich auf diese niedrige Ebene des Datei-Uploads einzulassen. Es ist nur ein schlechter Rat.
Adaddinsane
2
Upvoted. Dies ist die klarste Methode zum Hochladen nicht verwalteter Dateien. Um den ursprünglichen Dateinamen zu erhalten, den Sie verwenden können $file_name = $file->getClientOriginalName(), speichern Sie die Datei über am endgültigen Speicherort file_unmanaged_copy($file_path, "PATH/$file_name");.
Michal Gow
Danke fürs posten, CamelCode. In bestimmten erweiterten Implementierungen sind diese Informationen hilfreich. Upvoted.
Tyler Fahey