Làm cách nào để tải lên tệp trong biểu mẫu drupal8 với tệp loại phần tử biểu mẫu?


10

Tôi muốn tải lên một tệp và tôi phải sử dụng loại phần tử biểu mẫu là 'tệp'. Trong chức năng gửi, tôi không thể nhận được bất kỳ dữ liệu thích hợp nào liên quan đến tệp mà tôi đang tải lên. Vì vậy, bất cứ ai có thể xin vui lòng giúp tôi giải quyết điều này. Vui lòng tìm mã dưới đây:

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

}

Gửi chức năng:

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

Câu trả lời:


8

Tôi đã có cùng một vấn đề với các fileyếu tố hình thức. Giải quyết điều này bằng cách sử dụng managed_filevà cung cấp vị trí tải lên và trình xác nhận trong phần tử biểu mẫu:

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

Sau đó, trong trình:

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

Xin chào, cảm ơn bạn đã gợi ý. thậm chí tôi đã thành công với phương pháp này. Nhưng ở đây, làm thế nào tôi có thể ngăn chặn các mục trùng lặp trong thư mục công cộng. Vì lý do này, tôi đã chọn loại "tập tin". trong việc này, chúng ta có thể thực hiện bằng cách sử dụng file_save_upload vì vậy ..
Suraj

Các tập tin tạm thời bị xóa tự động, tôi nghĩ theo mặc định trong vòng 6 giờ. Nếu bạn không muốn đợi, bạn có thể xóa nó sau khi bạn đã lưu tệp vĩnh viễn.
4k4

Tôi không nói về tập tin tạm thời bạn thân. nếu tôi tải lên cùng một tệp hai lần, thì lần đó nó giữ cả hai tệp trong thư mục chung bằng cách nối thêm số ngẫu nhiên vào tệp mới nhất. loại trùng lặp này đang nói.
Suraj

Bạn có thể kiểm tra một tệp hiện có cùng tên trước khi bạn tạo tệp tạm thời vĩnh viễn.
4k4

5

Bạn có thể truy cập dữ liệu tệp được tải lên thông qua trường "tệp" bằng mã sau (từ D8.5 core / module / config / src / Form / ConfigImportForm.php)

$all_files = $this->getRequest()->files->get('files', []);
$file = $all_files['test_CERTIFICATE'];
$file_path = $file->getRealPath();

Rất muốn biết lý do cho downvote. Phức tạp không cần thiết, hoặc thực hành xấu?
almcnicoll

2
Tôi tin rằng đây là một câu hỏi chính xác hơn, khi bạn sử dụng '#type' => 'file'đây là cách để lấy tệp.
andeerg

@almcnicoll Lý do cho downvote là không có lý do để vào mức độ tải lên tệp thấp này. Đó chỉ là lời khuyên tồi.
Adaddinsane

2
Nâng cao. Đây là cách rõ ràng nhất để tải lên các tệp không được quản lý. Để có được tên tệp gốc bạn có thể sử dụng $file_name = $file->getClientOriginalName(), sau đó lưu tệp vào vị trí cuối cùng thông qua file_unmanaged_copy($file_path, "PATH/$file_name");.
Michal Gow

Cảm ơn bạn đã đăng bài, CamelCode. Trong một số triển khai nâng cao nhất định, thông tin này rất hữu ích. Nâng cao.
Tyler Fahey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.