引言
图片上传的基本原理
- 用户在客户端选择图片文件。
- 浏览器将图片文件以二进制形式发送到服务器。
- 服务器端的PHP脚本接收文件,并进行验证和存储。
- 图片文件存储在服务器的指定目录。
实现图片上传的步骤
1. 创建HTML表单
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="image" accept="image/*">
<input type="submit" value="上传图片">
</form>
2. 编写PHP脚本处理上传
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['image'])) {
$image = $_FILES['image'];
$upload_dir = 'uploads/';
$allowed_extensions = ['jpg', 'jpeg', 'png', 'gif'];
$max_file_size = 2 * 1024 * 1024; // 2MB
// 验证文件类型
$file_extension = strtolower(pathinfo($image['name'], PATHINFO_EXTENSION));
if (!in_array($file_extension, $allowed_extensions)) {
die('Invalid file type.');
}
// 验证文件大小
if ($image['size'] > $max_file_size) {
die('File size exceeds the maximum limit.');
}
// 移动文件到上传目录
$new_file_path = $upload_dir . uniqid() . '.' . $file_extension;
if (move_uploaded_file($image['tmp_name'], $new_file_path)) {
echo "File uploaded successfully.";
} else {
echo "Error uploading file.";
}
}
?>
3. 设置上传目录权限
确保服务器上指定的上传目录(uploads/)具有可写权限。
chmod 755 uploads/
4. 测试上传功能
安全注意事项
1. 验证文件类型
2. 文件大小
上传的文件大小可以防止服务器资源被过度占用。
3. 避免文件名注入
使用 uniqid() 函数生成唯一的文件名,避免文件名注入攻击。
4. 防止目录遍历
确保上传目录不在服务器文件系统的根目录,以防止目录遍历攻击。