Como fazer upload de arquivo em formulários drupal8 com o arquivo de tipo de elemento de formulário?

10

Quero fazer upload de um arquivo e tenho que usar o tipo de elemento do formulário como 'arquivo'. Na função de envio, não consigo obter dados adequados relacionados ao arquivo que estou carregando. SO alguém pode me ajudar a resolver isso. Encontre o código abaixo:

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

}

Função de envio:

  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
fonte
Consulte o repositório do github para obter um formulário personalizado com o upload do arquivo. github.com/nitin-kawane/…
Nitin

Respostas:

10

Eu tive o mesmo problema com o fileelemento do formulário. Resolvido isso usando managed_filee fornecendo o local de upload e os validadores no elemento de formulário:

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

Em seguida, envie:

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
fonte
Olá, obrigado pela sua sugestão. até eu obtive sucesso com esse método. Mas aqui, como posso impedir a entrada de arquivos duplicados na pasta pública. Por esse motivo, optei pelo tipo "arquivo". neste que podemos fazer usando file_save_upload assim ..
Suraj
O arquivo temporário é excluído automaticamente, acho que por padrão dentro de 6 horas. Se você não quiser esperar, poderá excluí-lo depois de salvar o arquivo permanente.
4k4
Eu não estou falando sobre amigo de arquivo temporário. se eu enviei o mesmo arquivo duas vezes, dessa vez é mantendo os dois arquivos na pasta pública, acrescentando um número aleatório ao arquivo mais recente. esse tipo de duplicação estou dizendo.
Suraj
Você pode procurar um arquivo existente com o mesmo nome antes de tornar o arquivo temporário permanente.
4k4
7

Você pode acessar os dados dos arquivos enviados por meio do campo "file" usando o seguinte código (em 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
fonte
Gostaria de saber o motivo do voto negativo. Desnecessariamente complexo ou más práticas?
Almcnicoll 7/07/2018
2
Acredito que isso seja mais correto para a pergunta, quando você usa '#type' => 'file'esse é o caminho para obter o arquivo.
precisa
@almcnicoll O motivo do voto negativo foi que não há motivo para entrar nesse baixo nível de upload de arquivos. É apenas um mau conselho.
Adaddinsane 11/02/19
2
Votado. Essa é a maneira mais clara de fazer upload de arquivos não gerenciados. Para obter o nome do arquivo original, você pode usar $file_name = $file->getClientOriginalName()e, em seguida, salve o arquivo no local final via file_unmanaged_copy($file_path, "PATH/$file_name");.
Michal Gow
Obrigado por postar, CamelCode. Em certas implementações avançadas, essas informações são úteis. Votado.
Tyler Fahey