引言

图片上传基本流程

1. 创建HTML表单

<form action="upload.php" method="post" enctype="multipart/form-data">
  <input type="file" name="image" />
  <input type="submit" value="上传" />
</form>

这里,action 属性指定了表单提交后的处理页面(即 upload.php),method 属性指定了表单提交的方式(即 post),而 enctype 属性则用于指定表单数据类型(即 multipart/form-data,这对于文件上传是必需的)。

2. PHP处理上传

2.1 检查文件是否上传

if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['image'])) {
  // 文件上传成功
}

这段代码检查了是否通过POST方法提交了表单,并且 image 文件是否已成功上传。

2.2 检查文件大小和类型

$allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
$maxSize = 5 * 1024 * 1024; // 5MB

if (in_array($_FILES['image']['type'], $allowedTypes) && $_FILES['image']['size'] <= $maxSize) {
  // 文件类型和大小检查通过
}

这段代码检查了上传文件的类型和大小是否符合要求。

2.3 移动上传的文件

$targetPath = 'uploads/' . basename($_FILES['image']['name']);

if (move_uploaded_file($_FILES['image']['tmp_name'], $targetPath)) {
  // 文件上传成功
}

这段代码将上传的文件从临时目录移动到服务器上的指定目录。

图片处理

1. 调整图片大小

$src = imagecreatefromjpeg($targetPath);
$width = 800;
$height = (800 / $width) * imagesy($src);
$dst = imagecreatetruecolor($width, $height);

imagecopyresampled($dst, $src, 0, 0, 0, 0, $width, $height, imagesx($src), imagesy($src));

imagejpeg($dst, $targetPath);

imagedestroy($src);
imagedestroy($dst);

2. 添加水印

$watermarkPath = 'watermark.png';
$watermark = imagecreatefrompng($watermarkPath);
$src = imagecreatefromjpeg($targetPath);

imagecopy($src, $watermark, 0, 0, 0, 0, imagesx($watermark), imagesy($watermark));

imagejpeg($src, $targetPath);

imagedestroy($src);
imagedestroy($watermark);

总结