php实现上传实例
PHP 文件上传实现
在 PHP 中实现文件上传功能需要结合 HTML 表单和 PHP 文件处理逻辑。以下是一个完整的实现示例:
HTML 表单部分
创建一个包含文件上传字段的表单,确保设置 enctype="multipart/form-data":
<form action="upload.php" method="post" enctype="multipart/form-data">
<label for="fileToUpload">选择要上传的文件:</label>
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="上传文件" name="submit">
</form>
PHP 处理脚本 (upload.php)
<?php
$targetDir = "uploads/";
$targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
// 检查文件是否为真实的图片(可选)
if(isset($_POST["submit"])) {
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if($check !== false) {
$uploadOk = 1;
} else {
echo "文件不是图片。";
$uploadOk = 0;
}
}
// 检查文件是否已存在
if (file_exists($targetFile)) {
echo "抱歉,文件已存在。";
$uploadOk = 0;
}
// 限制文件大小(例如5MB)
if ($_FILES["fileToUpload"]["size"] > 5000000) {
echo "抱歉,文件太大。";
$uploadOk = 0;
}
// 限制文件类型(可选)
$allowedTypes = ["jpg", "png", "jpeg", "gif"];
if(!in_array($imageFileType, $allowedTypes)) {
echo "抱歉,只允许 JPG, JPEG, PNG 和 GIF 文件。";
$uploadOk = 0;
}
// 检查上传标志
if ($uploadOk == 0) {
echo "抱歉,文件未上传。";
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
echo "文件 ". htmlspecialchars(basename($_FILES["fileToUpload"]["name"])). " 已上传。";
} else {
echo "抱歉,上传文件时出错。";
}
}
?>
安全注意事项
确保上传目录有正确的权限设置:
// 创建上传目录(如果不存在)
if (!file_exists($targetDir)) {
mkdir($targetDir, 0755, true);
}
考虑对上传文件进行重命名,避免文件名冲突和安全问题:
$newFileName = uniqid() . '.' . $imageFileType;
$targetFile = $targetDir . $newFileName;
高级验证
对于更严格的安全检查,可以添加以下验证:
// 检查文件内容是否匹配扩展名
$allowedMimes = [
'jpg' => 'image/jpeg',
'png' => 'image/png',
'gif' => 'image/gif'
];
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$detectedMime = finfo_file($finfo, $_FILES["fileToUpload"]["tmp_name"]);
finfo_close($finfo);
if (!in_array($detectedMime, $allowedMimes)) {
echo "文件类型与实际内容不匹配。";
$uploadOk = 0;
}
错误处理
检查上传过程中可能出现的错误:
if ($_FILES["fileToUpload"]["error"] > 0) {
switch ($_FILES["fileToUpload"]["error"]) {
case UPLOAD_ERR_INI_SIZE:
echo "文件大小超过服务器限制。";
break;
case UPLOAD_ERR_FORM_SIZE:
echo "文件大小超过表单限制。";
break;
// 其他错误情况...
}
$uploadOk = 0;
}
这个实现包含了文件上传的基本功能和安全考虑,可以根据具体需求进行调整和扩展。







