¿Cómo cargar un archivo en formularios drupal8 con un archivo de tipo elemento de formulario?

10

Quiero cargar un archivo y tengo que usar el tipo de elemento de formulario como 'archivo'. En la función de envío, no puedo obtener ningún dato adecuado relacionado con el archivo que estoy cargando. Entonces, ¿alguien puede ayudarme a resolver esto? Por favor encuentre el siguiente código:

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

}

Función de envío:

  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
fuente
Consulte el repositorio de github para obtener un formulario personalizado con la carga de archivos. github.com/nitin-kawane/…
Nitin

Respuestas:

10

Tuve el mismo problema con el fileelemento de formulario. Resolvió esto usando managed_filey proporcionando la ubicación de carga y los validadores en el elemento de formulario:

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

Luego en enviar:

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
fuente
Hola, gracias por tu sugerencia. Incluso obtuve éxito con este método. Pero aquí, ¿cómo puedo evitar la entrada de archivos duplicados en la carpeta pública? Por esta razón, opté por el tipo de "archivo". en esto podemos hacerlo usando file_save_upload so ..
Suraj
El archivo temporal se elimina automáticamente, creo que por defecto dentro de las 6 horas. Si no desea esperar, puede eliminarlo después de haber guardado el archivo permanente.
4k4
No estoy diciendo sobre el archivo temporal amigo. si cargué el mismo archivo dos veces, esa vez es mantener los dos archivos en la carpeta pública agregando un número aleatorio al último archivo. Este tipo de duplicación estoy diciendo.
Suraj
Puede buscar un archivo existente con el mismo nombre antes de hacer que el archivo temporal sea permanente.
4k4
7

Puede acceder a los datos de archivos cargados a través del campo "archivo" utilizando el siguiente código (desde 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();
CamelCode
fuente
Me encantaría saber la razón del voto negativo. ¿Innecesariamente complejo o mala práctica?
almcnicoll
2
Creo que esta es una pregunta más correcta, cuando usa '#type' => 'file'esta es la forma de obtener el archivo.
andeersg
@almcnicoll La razón del voto negativo fue que no hay razón para entrar en este bajo nivel de carga de archivos. Es solo un mal consejo.
Adaddinsane
2
Votado Esta es la forma más clara de cargar archivos no administrados. Para obtener el nombre de archivo original que puede usar $file_name = $file->getClientOriginalName(), y luego guarde el archivo en la ubicación final a través de file_unmanaged_copy($file_path, "PATH/$file_name");.
Michal Gow
Gracias por publicar, CamelCode. En ciertas implementaciones avanzadas, esta información es útil. Votado
Tyler Fahey