如何在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
相关产品推荐
相关产品推荐

