php实现多文件上传
PHP 多文件上传实现方法
前端表单设置
确保HTML表单中设置enctype="multipart/form-data"属性,并使用<input type="file" multiple>实现多文件选择:
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="files[]" multiple>
<button type="submit">上传</button>
</form>
后端处理逻辑
在PHP中通过$_FILES超全局数组接收文件,注意多文件会被组织为三维数组结构:

if(isset($_FILES['files'])){
$fileCount = count($_FILES['files']['name']);
for($i=0; $i<$fileCount; $i++){
$fileName = $_FILES['files']['name'][$i];
$fileTmp = $_FILES['files']['tmp_name'][$i];
$fileSize = $_FILES['files']['size'][$i];
$fileError = $_FILES['files']['error'][$i];
if($fileError === 0){
$fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
$newFileName = uniqid('', true).'.'.$fileExt;
$uploadPath = 'uploads/'.$newFileName;
move_uploaded_file($fileTmp, $uploadPath);
}
}
}
安全增强措施
添加文件类型和大小验证:
$allowedExts = ['jpg', 'png', 'pdf'];
$maxSize = 5 * 1024 * 1024; // 5MB
if(!in_array($fileExt, $allowedExts)){
die("不允许的文件类型");
}
if($fileSize > $maxSize){
die("文件大小超过限制");
}
错误处理机制
针对不同上传错误代码进行处理:

switch($fileError){
case UPLOAD_ERR_INI_SIZE:
$message = "文件超过服务器限制";
break;
case UPLOAD_ERR_FORM_SIZE:
$message = "文件超过表单限制";
break;
case UPLOAD_ERR_PARTIAL:
$message = "文件只有部分被上传";
break;
case UPLOAD_ERR_NO_FILE:
$message = "没有文件被上传";
break;
case UPLOAD_ERR_NO_TMP_DIR:
$message = "缺少临时文件夹";
break;
case UPLOAD_ERR_CANT_WRITE:
$message = "写入磁盘失败";
break;
default:
$message = "未知上传错误";
}
文件命名优化
使用更安全的文件名生成方式:
$safeName = preg_replace("/[^a-zA-Z0-9\.]/", "_", $fileName);
$newFileName = date('Ymd-His').'-'.$safeName;
完整示例代码
整合所有功能的完整实现:
$uploadDir = 'uploads/';
if(!file_exists($uploadDir)){
mkdir($uploadDir, 0755, true);
}
if(isset($_FILES['files'])){
$allowed = ['jpg', 'jpeg', 'png', 'gif'];
$maxSize = 5242880;
foreach($_FILES['files']['tmp_name'] as $key => $tmpName){
$fileName = $_FILES['files']['name'][$key];
$fileSize = $_FILES['files']['size'][$key];
$fileError = $_FILES['files']['error'][$key];
$fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
if(in_array($fileExt, $allowed)){
if($fileError === 0){
if($fileSize <= $maxSize){
$newName = uniqid('', true).'.'.$fileExt;
$dest = $uploadDir.$newName;
if(move_uploaded_file($tmpName, $dest)){
echo "文件 {$fileName} 上传成功<br>";
}
}
}
}
}
}






