Drupal自定义模块中上传文件的最佳验证方案(无需第三方模块)
Drupal 自定义表单文件上传验证(替代弃用的
file_save_upload) 在Drupal 8/9/10里,file_save_upload()早就被弃用了,这就是你代码跑不起来的原因。下面是不用第三方模块的原生验证方案,亲测有效:
1. 先配置好表单文件元素
表单构建阶段,先给文件元素加上基础限制(前端提示+预验证,但后端必须做最终验证):
$form['cv'] = [ '#type' => 'file', '#title' => $this->t('上传CV'), '#description' => $this->t('支持格式:docx, doc, pdf, jpg, jpeg, png'), '#upload_validators' => [ // 限制允许的文件扩展名 'file_validate_extensions' => ['docx doc pdf jpg jpeg png'], // 可选:限制文件大小,比如5MB 'file_validate_size' => [5 * 1024 * 1024], ], ];
2. 在验证回调里用FileUploadHandler处理
在表单类的validateForm()方法中,用Drupal官方推荐的FileUploadHandler替代弃用的函数,代码示例:
use Drupal\Core\File\FileUploadHandler; use Drupal\Core\Form\FormStateInterface; public function validateForm(array &$form, FormStateInterface $form_state) { parent::validateForm($form, $form_state); // 获取上传的文件数据 $uploaded_files = $this->getRequest()->files->get('files', []); if (!empty($uploaded_files['cv'])) { $file_data = $uploaded_files['cv']; $validators = $form['cv']['#upload_validators']; // 初始化文件上传处理器 $upload_handler = new FileUploadHandler( $file_data, $this->getRequest(), \Drupal::service('file_system'), \Drupal::service('file.mime_type.guesser') ); try { // 执行验证,通过后返回文件对象 $file = $upload_handler->handleFileUpload($validators, FALSE, 0); // 将验证后的文件存入form_state $form_state->setValue('cv', $file); } catch (\Exception $e) { // 验证失败时设置表单错误提示 $form_state->setErrorByName('cv', $this->t('Uw CV heeft een niet-toegestane extensie. Probeer het opnieuw.')); } } else { // 按需添加未上传文件的必填提示 $form_state->setErrorByName('cv', $this->t('请上传您的CV文件。')); } }
3. 自定义验证(可选)
如果需要更严格的验证(比如防止恶意修改扩展名的文件),可以添加自定义MIME类型验证函数:
// 自定义验证函数,可放在模块的.module文件或表单类内部 function my_module_validate_file_mime_type($file) { $allowed_mime_types = [ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', // docx 'application/msword', // doc 'application/pdf', // pdf 'image/jpeg', // jpg/jpeg 'image/png', // png ]; $file_mime = $file->getMimeType(); if (!in_array($file_mime, $allowed_mime_types)) { return [$this->t('文件类型不允许,请上传指定格式的文件。')]; } return []; } // 在表单元素的#upload_validators中添加这个自定义验证 '#upload_validators' => [ 'file_validate_extensions' => ['docx doc pdf jpg jpeg png'], 'my_module_validate_file_mime_type' => [], ],
关键注意点
- 前端验证仅作为用户提示,必须依赖后端验证确保安全,避免绕过前端限制的恶意上传。
FileUploadHandler是Drupal官方推荐的替代方案,相比旧的file_save_upload能处理更多边界情况,安全性更高。
内容的提问来源于stack exchange,提问作者Stef Verniers
相关产品推荐
相关产品推荐

