フォーム要素タイプのファイルを使用してdrupal8フォームでファイルをアップロードする方法


10

ファイルをアップロードしたいのですが、フォーム要素のタイプを「ファイル」として使用する必要があります。送信機能で、アップロードしているファイルに関連する適切なデータを取得できません。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();
           }
    }

ファイルをアップロードするカスタムフォームについては、githubリポジトリを参照してください。github.com/nitin-kawane/...
ニティン

回答:


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を使用して行うことができます。..
スラジ

一時ファイルは自動的に削除されます。デフォルトでは6時間以内だと思います。待ちたくない場合は、永続ファイルを保存した後で削除できます。
2017

一時ファイルのバディについては言っていません。同じファイルを2回アップロードした場合は、最新のファイルに乱数を追加して、両方のファイルをパブリックフォルダーに保持します。このタイプの重複はわかります。
スラジュ2017

一時ファイルを永続化する前に、同じ名前の既存のファイルを確認できます。
2017

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

反対投票の理由を知りたいです。不必要に複雑、または悪い習慣?
almcnicoll

2
これを使用'#type' => 'file'すると、ファイルを取得する方法がわかります。
andeersg 2018

@almcnicoll反対票の理由は、この低レベルのファイルアップロードに入る理由がないためです。それはただの悪いアドバイスです。
Adaddinsane

2
賛成。これは、管理されていないファイルをアップロードする最も明確な方法です。元のファイル名を取得するには$file_name = $file->getClientOriginalName()、を使用し、を介してファイルを最終的な場所に保存しますfile_unmanaged_copy($file_path, "PATH/$file_name");
Michal Gow、

CamelCode、投稿いただきありがとうございます。特定の高度な実装では、この情報が役立ちます。賛成。
タイラーフェイヒー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.