引言
一、前端准备
<form action="upload.php" method="post" enctype="multipart/form-data">
<label for="image">选择图片文件:</label>
<input type="file" name="image" id="image" required>
<input type="submit" value="上传图片">
</form>
这里,enctype="multipart/form-data" 是非常重要的,它允许表单数据以二进制形式发送,这对于文件上传是必需的。
二、后端处理
1. 验证图片文件
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$image = $_FILES['image'];
$imageType = mime_content_type($image['tmp_name']);
if ($imageType === 'image/jpeg' || $imageType === 'image/png' || $imageType === 'image/gif') {
// 文件是图片
} else {
// 文件不是图片
die('只能上传图片文件。');
}
}
2. 保存图片
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// ... 图片验证代码 ...
$uploadDir = 'uploads/';
$uploadPath = $uploadDir . basename($image['name']);
if (move_uploaded_file($image['tmp_name'], $uploadPath)) {
echo "文件已成功上传到: " . $uploadPath;
} else {
echo "文件上传失败。";
}
}
确保uploads/目录存在,并且网站有权限写入该目录。
3. 处理图片大小和格式
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// ... 图片验证和保存代码 ...
$imageTypes = ['image/jpeg', 'image/png', 'image/gif'];
$newWidth = 500;
$newHeight = 500;
switch ($imageType) {
case 'image/jpeg':
$srcImage = imagecreatefromjpeg($image['tmp_name']);
break;
case 'image/png':
$srcImage = imagecreatefrompng($image['tmp_name']);
break;
case 'image/gif':
$srcImage = imagecreatefromgif($image['tmp_name']);
break;
}
$dstImage = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($dstImage, $srcImage, 0, 0, 0, 0, $newWidth, $newHeight, imagesx($srcImage), imagesy($srcImage));
if (in_array($imageType, $imageTypes)) {
imagejpeg($dstImage, $uploadPath);
}
}
三、安全性考虑
- 验证文件类型,避免上传恶意文件。
- 使用
move_uploaded_file()函数来移动文件,它检查文件是否确实是通过POST上传的。 - 设置合适的文件名,避免路径遍历攻击。
- 对上传的文件进行大小,避免服务器资源被耗尽。