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();
           }
    }
Suraj
sumber
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();
}
4k4
sumber
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();
CamelCode
sumber
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