Come caricare file in moduli drupal8 con file di tipo di elemento modulo?


10

Voglio caricare un file e devo usare il tipo di elemento del modulo come 'file'. Nella funzione di invio non sono in grado di ottenere dati corretti relativi al file che sto caricando. Quindi qualcuno può aiutarmi a risolvere questo problema. Si prega di trovare il seguente codice:

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

}

Funzione di invio:

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

Fare riferimento al repository github per un modulo personalizzato con caricamento di file. github.com/nitin-kawane/…
Nitin

Risposte:


10

Ho avuto lo stesso problema con l' fileelemento del modulo. Risolto questo problema utilizzando managed_filee fornendo la posizione di caricamento e i validatori nell'elemento modulo:

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

Quindi inoltrare:

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

Ciao, grazie per il tuo suggerimento. anche io ho avuto successo con questo metodo. Ma qui, come posso impedire l'inserimento di file duplicati nella cartella pubblica. Per questo motivo ho optato per il tipo di "file". in questo possiamo fare usando file_save_upload così ..
Suraj

Il file temporaneo viene eliminato automaticamente, penso di default entro 6 ore. Se non vuoi aspettare puoi cancellarlo dopo aver salvato il file permanente.
4k4,

Non sto parlando di un amico temporaneo di file. se ho caricato lo stesso file due volte, quella volta ha mantenuto entrambi i file nella cartella pubblica aggiungendo un numero casuale all'ultimo file. sto dicendo questo tipo di duplicazione.
Suraj,

È possibile verificare la presenza di un file esistente con lo stesso nome prima di rendere permanente il file temporaneo.
4k4

7

Puoi accedere ai dati dei file caricati attraverso il campo "file" usando il seguente codice (da 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();

Mi piacerebbe conoscere la ragione del downvote. Pratiche inutilmente complesse o cattive?
almcnicoll,

2
Credo che questo sia più corretto alla domanda, quando si utilizza '#type' => 'file'questo è il modo per ottenere il file.
Andeersg,

@almcnicoll Il motivo del downvote è che non c'è motivo di entrare in questo basso livello di caricamento dei file. È solo un cattivo consiglio.
Adaddinsane,

2
Upvoted. Questo è il modo più chiaro di caricare file non gestiti. Per ottenere il nome del file originale è possibile utilizzare $file_name = $file->getClientOriginalName(), quindi salvare il file nella posizione finale tramite file_unmanaged_copy($file_path, "PATH/$file_name");.
Michal Gow,

Grazie per la pubblicazione, CamelCode. In alcune implementazioni avanzate, queste informazioni sono utili. Upvoted.
Tyler Fahey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.