php相册实现
PHP相册实现步骤
数据库设计
创建数据库表存储相册信息,例如:
CREATE TABLE albums (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE photos (
id INT AUTO_INCREMENT PRIMARY KEY,
album_id INT,
filename VARCHAR(255) NOT NULL,
caption TEXT,
uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (album_id) REFERENCES albums(id)
);
文件上传处理
创建文件上传表单和处理脚本:
// upload.php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$targetDir = "uploads/";
$targetFile = $targetDir . basename($_FILES["photo"]["name"]);
if (move_uploaded_file($_FILES["photo"]["tmp_name"], $targetFile)) {
// 保存到数据库
$stmt = $pdo->prepare("INSERT INTO photos (album_id, filename) VALUES (?, ?)");
$stmt->execute([$_POST['album_id'], basename($_FILES["photo"]["name"])]);
}
}
相册展示
创建展示相册的页面:
// albums.php
$albums = $pdo->query("SELECT * FROM albums")->fetchAll();
foreach ($albums as $album) {
echo "<h3>{$album['title']}</h3>";
$photos = $pdo->prepare("SELECT * FROM photos WHERE album_id = ?");
$photos->execute([$album['id']]);
foreach ($photos->fetchAll() as $photo) {
echo "<img src='uploads/{$photo['filename']}' alt='{$photo['caption']}'>";
}
}
安全措施
实现基本安全防护:

// 文件类型检查
$allowedTypes = ['image/jpeg', 'image/png'];
if (!in_array($_FILES['photo']['type'], $allowedTypes)) {
die("Invalid file type");
}
// 防止目录遍历
$filename = basename($_FILES["photo"]["name"]);
$targetFile = $targetDir . $filename;
缩略图生成
使用GD库创建缩略图:
function createThumbnail($source, $dest, $thumbWidth = 200) {
$sourceImage = imagecreatefromjpeg($source);
$width = imagesx($sourceImage);
$height = imagesy($sourceImage);
$thumbHeight = floor($height * ($thumbWidth / $width));
$destImage = imagecreatetruecolor($thumbWidth, $thumbHeight);
imagecopyresampled($destImage, $sourceImage, 0, 0, 0, 0,
$thumbWidth, $thumbHeight, $width, $height);
imagejpeg($destImage, $dest);
imagedestroy($sourceImage);
imagedestroy($destImage);
}
分页功能
为大量照片添加分页:
$perPage = 12;
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$offset = ($page - 1) * $perPage;
$photos = $pdo->prepare(
"SELECT * FROM photos WHERE album_id = ? LIMIT $offset, $perPage"
);
$photos->execute([$albumId]);
额外功能建议
用户系统
添加用户认证,使每个用户拥有独立相册:

ALTER TABLE albums ADD COLUMN user_id INT;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL
);
图片处理
集成更强大的图片处理库如ImageMagick:
exec("convert source.jpg -resize 800x600 output.jpg");
前端增强
使用JavaScript实现更流畅的用户体验:
// AJAX上传
document.getElementById('uploadForm').addEventListener('submit', function(e) {
e.preventDefault();
let formData = new FormData(this);
fetch('upload.php', {
method: 'POST',
body: formData
}).then(response => {
// 更新页面
});
});
云存储集成
将图片存储在云服务如AWS S3:
require 'vendor/autoload.php';
use Aws\S3\S3Client;
$s3 = new S3Client([
'version' => 'latest',
'region' => 'us-east-1'
]);
$result = $s3->putObject([
'Bucket' => 'my-bucket',
'Key' => 'photos/' . basename($_FILES['photo']['name']),
'Body' => fopen($_FILES['photo']['tmp_name'], 'rb')
]);






