You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 01:55:59