如何使用表单元素类型文件以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/...
尼廷

Answers:


10

我对fileform元素有同样的问题。通过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();
}

嗨,谢谢您的建议。甚至我用这种方法也取得了成功。但是在这里,如何防止公用文件夹中出现重复文件。由于这个原因,我选择了“文件”类型。在这种情况下,我们可以使用file_save_upload这样来做。.–
Suraj

我认为默认情况下会在6小时内自动删除该临时文件。如果您不想等待,可以在保存永久文件后将其删除。
4k4

我不是在谈论临时文件好友。如果我上载相同的文件两次,则通过将随机数附加到最新文件中来将两个文件都保留在公共文件夹中。这种重复很能说明问题。
Suraj

在将临时文件设为永久文件之前,您可以检查同名的现有文件。
4k4,7

7

您可以使用以下代码(从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();

很想知道反对的理由。不必要的复杂或不良做法?
almcnicoll

2
我相信这是更正确的问题,当您使用'#type' => 'file'这种方式来获取文件时。
andeersg '18

@almcnicoll拒绝投票的原因是没有理由进入这种低级别的文件上传。这只是个坏建议。
Adaddinsane

2
已投票。这是上传非托管文件的最清晰的方法。要获取原始文件名,可以使用$file_name = $file->getClientOriginalName(),然后通过将该文件保存到最终位置file_unmanaged_copy($file_path, "PATH/$file_name");
Michal Gow,

感谢您的发布,CamelCode。在某些高级实现中,此信息很有用。已投票。
Tyler Fahey
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.