php 多图实现
多图上传实现方法
在PHP中实现多图上传需要使用HTML表单的multiple属性结合PHP的文件处理功能。以下是一个完整的实现方案:
HTML表单部分
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="images[]" multiple>
<input type="submit" value="上传">
</form>
PHP处理脚本(upload.php)
<?php
if(isset($_FILES['images'])){
$uploadDir = 'uploads/';
foreach($_FILES['images']['tmp_name'] as $key => $tmp_name){
$fileName = $_FILES['images']['name'][$key];
$fileTmp = $_FILES['images']['tmp_name'][$key];
$fileSize = $_FILES['images']['size'][$key];
$fileError = $_FILES['images']['error'][$key];
$fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
$allowed = ['jpg', 'jpeg', 'png', 'gif'];
if(in_array($fileExt, $allowed)){
if($fileError === 0){
if($fileSize < 5000000){
$newFileName = uniqid('', true).'.'.$fileExt;
$fileDest = $uploadDir.$newFileName;
move_uploaded_file($fileTmp, $fileDest);
echo "文件 {$fileName} 上传成功<br>";
} else {
echo "文件 {$fileName} 太大<br>";
}
} else {
echo "上传文件 {$fileName} 时出错<br>";
}
} else {
echo "不允许上传 {$fileExt} 类型的文件<br>";
}
}
}
?>
图片压缩处理
上传后可能需要压缩图片以节省空间:
function compressImage($source, $destination, $quality) {
$info = getimagesize($source);
if ($info['mime'] == 'image/jpeg') {
$image = imagecreatefromjpeg($source);
} elseif ($info['mime'] == 'image/png') {
$image = imagecreatefrompng($source);
}
imagejpeg($image, $destination, $quality);
imagedestroy($image);
}
// 使用示例
compressImage($fileDest, $fileDest, 75);
数据库存储方案
将上传的图片信息存入MySQL数据库:
// 数据库连接
$db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
// 准备SQL
$stmt = $db->prepare("INSERT INTO images (filename, path, size, upload_date) VALUES (?, ?, ?, NOW())");
foreach($_FILES['images']['name'] as $key => $name) {
if($_FILES['images']['error'][$key] === UPLOAD_ERR_OK) {
$stmt->execute([
$name,
$uploadDir.$newFileName,
$_FILES['images']['size'][$key]
]);
}
}
安全注意事项
- 验证文件类型不要仅依赖扩展名,应使用
getimagesize()或finfo_file()检查实际文件内容 - 设置合理的上传大小限制,可在php.ini中配置
upload_max_filesize和post_max_size - 为上传文件生成随机文件名,避免文件名冲突和安全问题
- 将上传目录设置为不可执行脚本文件
前端预览实现
使用JavaScript实现上传前预览:
document.querySelector('input[type="file"]').addEventListener('change', function(e) {
const preview = document.getElementById('preview');
preview.innerHTML = '';
Array.from(e.target.files).forEach(file => {
if (!file.type.match('image.*')) continue;
const reader = new FileReader();
reader.onload = function(e) {
const img = document.createElement('img');
img.src = e.target.result;
img.style.maxHeight = '100px';
preview.appendChild(img);
}
reader.readAsDataURL(file);
});
});
以上方案提供了从客户端上传到服务器处理、存储的完整流程,可根据实际需求进行调整。







