Как загрузить файл в формы drupal8 с файлом типа элемента формы?

10

Я хочу загрузить файл, и мне нужно использовать тип элемента формы как «файл». В функции отправки я не могу получить какие-либо надлежащие данные, относящиеся к файлу, который я загружаю. Так может кто-нибудь, пожалуйста, помогите мне решить эту проблему. Пожалуйста, найдите ниже код:

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

}

Отправить функцию:

  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();
           }
    }
Сураджа
источник
Обратитесь в репозиторий github для пользовательской формы с загрузкой файлов. github.com/nitin-kawane/…
Нитин

Ответы:

10

У меня была такая же проблема с fileэлементом формы. Решить это, используя managed_fileи предоставив место загрузки и валидаторы в элементе формы:

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

Затем в представьте:

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
источник
Привет, спасибо за ваше предложение. даже я добился успеха с этим методом. Но здесь, как я могу предотвратить запись дубликатов файлов в общую папку. По этой причине я выбрал тип файла. в этом мы можем сделать, используя file_save_upload так ..
Сурадж
Временный файл удаляется автоматически, я думаю, по умолчанию в течение 6 часов. Если вы не хотите ждать, вы можете удалить его после сохранения постоянного файла.
4k4
Я не говорю о временном напарнике. если я загружал один и тот же файл дважды, то в это время он сохраняет оба файла в общей папке, добавляя случайное число в последний файл. этот тип дублирования говорю.
Сурадж
Вы можете проверить существующий файл с тем же именем, прежде чем сделать временный файл постоянным.
4k4
7

Вы можете получить доступ к файлам данных, загруженных через поле «file», используя следующий код (из 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
источник
Хотелось бы узнать причину понижения. Излишне сложная или плохая практика?
almcnicoll
2
Я считаю, что это более правильный вопрос, когда вы используете '#type' => 'file'этот способ, чтобы получить файл.
andeersg
@almcnicoll Причиной понижения было то, что нет причин попадать на этот низкий уровень загрузки файлов. Это просто плохой совет.
Adaddinsane
2
Upvoted. Это самый простой способ загрузки неуправляемых файлов. Чтобы получить исходное имя файла, которое вы можете использовать $file_name = $file->getClientOriginalName(), а затем сохраните файл в окончательном месте через file_unmanaged_copy($file_path, "PATH/$file_name");.
Михал Гоу
Спасибо за публикацию, CamelCode. В некоторых расширенных реализациях эта информация полезна. Upvoted.
Тайлер Фахи