Bagaimana cara mengunggah file dalam bentuk drupal8 dengan file tipe elemen form?


10

Saya ingin mengunggah file dan saya harus menggunakan tipe elemen formulir sebagai 'file'. Dalam fungsi kirim, saya tidak bisa mendapatkan data yang benar terkait dengan file yang saya unggah. SO Adakah yang bisa membantu saya untuk menyelesaikan ini. Silakan temukan kode di bawah ini:

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

}

Kirim fungsi:

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

Lihat repositori github untuk formulir kustom dengan unggahan file. github.com/nitin-kawane/…
Nitin

Jawaban:


10

Saya memiliki masalah yang sama dengan fileelemen form. Selesaikan ini dengan menggunakan managed_filedan menyediakan lokasi unggah dan validator dalam elemen formulir:

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

Kemudian di ajukan:

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

Hai, terima kasih atas saran Anda. bahkan saya mendapatkan kesuksesan dengan metode ini. Tapi di sini, bagaimana saya bisa mencegah masuknya file duplikat ke folder publik. Karena alasan inilah saya memilih jenis "file". dalam hal ini bisa kita lakukan dengan menggunakan file_save_upload jadi ..
Suraj

File sementara dihapus secara otomatis, saya pikir secara default dalam 6 jam. Jika Anda tidak ingin menunggu, Anda dapat menghapusnya setelah Anda menyimpan file permanen.
4k4

Saya tidak memberi tahu tentang file sementara sobat. jika saya mengunggah file yang sama dua kali, saat itu menyimpan kedua file di folder publik dengan menambahkan nomor acak ke file terbaru. jenis duplikasi ini memberitahu saya.
Suraj

Anda dapat memeriksa file yang ada dengan nama yang sama sebelum Anda membuat file sementara itu permanen.
4k4

7

Anda dapat mengakses data file yang diunggah melalui bidang "file" menggunakan kode berikut (dari 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();

Ingin tahu alasan untuk downvote. Kompleks yang tidak perlu, atau praktik buruk?
almcnicoll

2
Saya percaya ini adalah pertanyaan yang lebih benar, ketika Anda menggunakan '#type' => 'file'ini adalah cara untuk mendapatkan file.
andeersg

@almcnicoll Alasan untuk downvote adalah tidak ada alasan untuk masuk ke unggahan file tingkat rendah ini. Itu hanya saran yang buruk.
Adaddinsane

2
Terpilih. Ini adalah cara paling jelas untuk mengunggah file yang tidak dikelola. Untuk mendapatkan nama file asli yang dapat Anda gunakan $file_name = $file->getClientOriginalName(), dan kemudian simpan file ke lokasi akhir via file_unmanaged_copy($file_path, "PATH/$file_name");.
Michal Gow

Terima kasih telah memposting, CamelCode. Dalam implementasi lanjutan tertentu, informasi ini berguna. Terpilih.
Tyler Fahey
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.