引言
图片上传的基本原理
- 客户端选择并提交图片文件。
- 服务器接收图片文件。
- 服务器存储图片文件。
- 图片信息展示。
客户端图片上传
<form action="upload.php" method="post" enctype="multipart/form-data">
选择图片:<input type="file" name="image">
<input type="submit" value="上传">
</form>
这里的enctype="multipart/form-data"是关键,它告诉服务器这是一个包含文件上传的表单。
服务器端接收图片
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['image'])) {
$image = $_FILES['image'];
$errors = [];
// 检查文件是否上传成功
if ($image['error'] === UPLOAD_ERR_OK) {
// 检查文件类型
$fileTypes = ['image/jpeg', 'image/png', 'image/gif'];
if (!in_array($image['type'], $fileTypes)) {
$errors[] = '不支持的文件类型。';
}
// 检查文件大小
$maxFileSize = 2 * 1024 * 1024; // 2MB
if ($image['size'] > $maxFileSize) {
$errors[] = '文件大小超过。';
}
// 移动文件到服务器
$uploadPath = 'uploads/' . basename($image['name']);
if (move_uploaded_file($image['tmp_name'], $uploadPath)) {
echo "文件上传成功。";
} else {
$errors[] = '文件上传失败。';
}
} else {
$errors[] = '文件上传出错。';
}
// 输出错误信息
if (!empty($errors)) {
foreach ($errors as $error) {
echo $error . '<br>';
}
}
}
?>
在上面的代码中,我们首先检查是否是POST请求并且文件是否成功上传。接着,我们检查文件类型和大小,然后将其移动到服务器上的指定目录。
服务器端存储图片
图片信息展示
<?php
if (file_exists('uploads/' . $image['name'])) {
echo '<img src="uploads/' . htmlspecialchars($image['name']) . '" alt="上传的图片">';
}
?>
这里使用了htmlspecialchars函数来防止跨站脚本攻击(XSS)。
安全注意事项
- 文件类型检查:确保只允许上传指定的文件类型,如上例中的JPEG、PNG和GIF。
- 文件大小:上传文件的大小,以防止服务器资源被滥用。
- 文件名处理:不要直接使用用户上传的文件名,以免目录遍历攻击。在上面的代码中,我们使用
basename函数来获取文件名。 - 错误处理:妥善处理上传过程中的错误,并给出有用的反馈。