php实现文件上传
文件上传的基本实现
在PHP中实现文件上传需要使用$_FILES超全局数组处理上传的文件数据。表单必须设置enctype="multipart/form-data"属性,并采用POST方法提交。
创建包含文件上传字段的HTML表单:
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="fileToUpload">
<input type="submit" value="Upload File">
</form>
处理上传的PHP脚本(upload.php):
$targetDir = "uploads/";
$targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]);
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
echo "文件已成功上传";
} else {
echo "文件上传失败";
}
安全验证措施
验证文件类型通过检查MIME类型和文件扩展名:
$allowedTypes = ['image/jpeg', 'image/png'];
$fileType = $_FILES["fileToUpload"]["type"];
if (!in_array($fileType, $allowedTypes)) {
die("不允许的文件类型");
}
限制文件大小:

$maxSize = 2 * 1024 * 1024; // 2MB
if ($_FILES["fileToUpload"]["size"] > $maxSize) {
die("文件大小超过限制");
}
生成唯一文件名防止覆盖:
$extension = pathinfo($_FILES["fileToUpload"]["name"], PATHINFO_EXTENSION);
$newFileName = uniqid() . '.' . $extension;
$targetFile = $targetDir . $newFileName;
多文件上传处理
HTML表单设置多个文件字段:
<input type="file" name="filesToUpload[]" multiple>
PHP处理多个文件:

foreach ($_FILES["filesToUpload"]["tmp_name"] as $key => $tmpName) {
$targetFile = $targetDir . basename($_FILES["filesToUpload"]["name"][$key]);
move_uploaded_file($tmpName, $targetFile);
}
错误处理机制
检查上传过程中的各种错误:
if ($_FILES["fileToUpload"]["error"] !== UPLOAD_ERR_OK) {
switch ($_FILES["fileToUpload"]["error"]) {
case UPLOAD_ERR_INI_SIZE:
die("文件超过服务器限制");
case UPLOAD_ERR_FORM_SIZE:
die("文件超过表单限制");
// 其他错误处理...
}
}
文件上传最佳实践
确保上传目录存在并设置正确权限:
if (!file_exists($targetDir)) {
mkdir($targetDir, 0755, true);
}
禁用危险文件执行:
$deniedExtensions = ['php', 'exe', 'sh'];
if (in_array($extension, $deniedExtensions)) {
die("危险文件类型禁止上传");
}
使用更安全的文件类型检测方法:
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES["fileToUpload"]["tmp_name"]);
finfo_close($finfo);



