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

如何在PHP中使用单个表单的两个file上传控件实现依次上传

PHP 实现先传视频后传图片方案

1. 先修正你的表单代码

原表单缺少文件上传必须的enctype属性,且标签书写不完整,修正后代码如下:

<form action="" method="post" enctype="multipart/form-data">
  <input type="file" name="vid"> <!-- 用于选择并上传视频 -->
  <input type="file" name="pic"> <!-- 用于选择并上传图片 -->
  <input type="submit" value="send">
</form>

注意:enctype="multipart/form-data"是表单上传文件的必填属性,不添加文件无法正常提交到后端。

2. 后端核心处理逻辑

严格按照先处理视频、视频上传成功后再处理图片的顺序执行,避免无效资源消耗,代码如下:

<?php
// 上传目录配置,提前创建对应目录并给PHP进程开写入权限
$videoSavePath = './uploads/videos/';
$picSavePath = './uploads/pictures/';
// 文件校验规则配置,可按需调整
$allowVideoMime = ['video/mp4', 'video/avi', 'video/mov', 'video/wmv'];
$allowPicMime = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];
$maxVideoSize = 100 * 1024 * 1024; // 视频最大100MB
$maxPicSize = 5 * 1024 * 1024; // 图片最大5MB

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 第一步:优先处理视频上传
    if ($_FILES['vid']['error'] !== UPLOAD_ERR_OK) {
        echo "视频上传失败,错误码:" . $_FILES['vid']['error'];
        exit;
    }
    // 校验视频格式
    $videoMime = mime_content_type($_FILES['vid']['tmp_name']);
    if (!in_array($videoMime, $allowVideoMime)) {
        echo "仅支持mp4/avi/mov/wmv格式的视频";
        exit;
    }
    // 校验视频大小
    if ($_FILES['vid']['size'] > $maxVideoSize) {
        echo "视频大小不能超过100MB";
        exit;
    }
    // 生成唯一文件名避免覆盖
    $videoSuffix = pathinfo($_FILES['vid']['name'], PATHINFO_EXTENSION);
    $videoFinalName = uniqid('vid_') . '.' . $videoSuffix;
    // 保存视频到目标目录
    if (!move_uploaded_file($_FILES['vid']['tmp_name'], $videoSavePath . $videoFinalName)) {
        echo "视频保存失败,请检查目录权限";
        exit;
    }
    echo "视频上传成功<br>";

    // 第二步:视频上传成功后,才处理图片上传
    if ($_FILES['pic']['error'] !== UPLOAD_ERR_OK) {
        echo "图片上传失败,错误码:" . $_FILES['pic']['error'];
        // 按需开启:图片上传失败时删除已上传的视频,回滚操作
        // unlink($videoSavePath . $videoFinalName);
        exit;
    }
    // 校验图片格式
    $picMime = mime_content_type($_FILES['pic']['tmp_name']);
    if (!in_array($picMime, $allowPicMime)) {
        echo "仅支持jpg/png/gif/webp格式的图片";
        // unlink($videoSavePath . $videoFinalName);
        exit;
    }
    // 校验图片大小
    if ($_FILES['pic']['size'] > $maxPicSize) {
        echo "图片大小不能超过5MB";
        // unlink($videoSavePath . $videoFinalName);
        exit;
    }
    // 保存图片
    $picSuffix = pathinfo($_FILES['pic']['name'], PATHINFO_EXTENSION);
    $picFinalName = uniqid('pic_') . '.' . $picSuffix;
    if (!move_uploaded_file($_FILES['pic']['tmp_name'], $picSavePath . $picFinalName)) {
        echo "图片保存失败,请检查目录权限";
        // unlink($videoSavePath . $videoFinalName);
        exit;
    }
    echo "图片上传成功,全部文件上传完成";
}
?>

注意事项

  • 代码中mime_content_type依赖PHP的fileinfo扩展,若未开启可临时用$_FILES['xxx']['type']做初步校验,但该值由客户端提交不可靠,建议优先开启扩展
  • 代码中注释的unlink逻辑为上传失败回滚逻辑,可根据自身业务需求决定是否开启
  • 生产环境建议额外添加文件二次校验、文件名过滤、目录权限隔离等安全措施,避免恶意文件上传漏洞

内容的提问来源于stack exchange,提问作者Mohammad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:24:01