ファイルをアップロードしたいのですが、フォーム要素のタイプを「ファイル」として使用する必要があります。送信機能で、アップロードしているファイルに関連する適切なデータを取得できません。 SOこれを解決するために誰かが私を助けてくれますか?以下のコードを見つけてください:
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();
}
}
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();
}
次のコードを使用して、「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();