Warning: SQLite3Stmt::execute(): Unable to execute statement: attempt to write a readonly database in /srv/public/config/view_diary.php on line 45
servoo图床-php - Ws01 Note

文章详情

返回首页

servoo图床-php

分享文章 作者: Ws01 创建时间: 2025-11-24 📝 字数: 11,061 字 👁️ 阅读: 13 次

$imgRoot = './img9527abc'; // 务必修改此处!!图像存储根路径
if (!is_dir($imgRoot)) {
if (is_readable($imgRoot)) {
triggererror("{$imgRoot} 不是有效的目录", EUSER_NOTICE);
} else {
mkdir($imgRoot, 0777, true);
}
}

// 获取真实IP地址的函数(考虑使用CDN的情况)
function getRealIp() {
if (!empty($SERVER['HTTPCFCONNECTINGIP'])) { // Cloudflare CDN
return $SERVER['HTTPCFCONNECTINGIP'];
} elseif (!empty($SERVER['HTTPXFORWARDEDFOR'])) { // 通过其他CDN时
// 获取最后一个有效IP地址(避免多个IP时取第一个不可靠的)
$ipList = explode(',', $SERVER['HTTPXFORWARDEDFOR']);
return trim(end($ipList));
} else {
return $SERVER['REMOTEADDR']; // 默认获取直接连接的IP
}
}

// 处理图像上传
$uploadResults = [];
if ($SERVER['REQUESTMETHOD'] === 'POST' && isset($_FILES['images'])) {
foreach ($FILES['images']['tmpname'] as $key => $tmpName) {
$file = $_FILES['images'];
if ($file['error'][$key] === UPLOADERROK) {
$imageData = filegetcontents($tmpName);
$imageName = basename($file['name'][$key]);
$md5Hash = md5($imageData);
$uploadTime = time();
$uploaderIP = getRealIp();

// 将图像信息存储到SQLite数据库中
$dbPath = "$imgRoot/$md5Hash.db";
$db = new SQLite3($dbPath);

// 创建表格(如果表不存在)
$db->exec("CREATE TABLE IF NOT EXISTS images (
md5 TEXT PRIMARY KEY,
name TEXT,
upload_time INTEGER,
uploader_ip TEXT,
image_data BLOB
)");

// 检查是否已存在相同的md5
$stmt = $db->prepare("SELECT md5 FROM images WHERE md5 = :md5");
$stmt->bindValue(':md5', $md5Hash, SQLITE3_TEXT);
$result = $stmt->execute();
if (!$result->fetchArray()) {
// 使用二进制数据和压缩后存储
$compressedImageData = gzcompress($imageData);

// 插入图像数据
$stmt = $db->prepare("INSERT INTO images (md5, name, uploadtime, uploaderip, imagedata) VALUES (:md5, :name, :uploadtime, :uploaderip, :imagedata)");
$stmt->bindValue(':md5', $md5Hash, SQLITE3_TEXT);
$stmt->bindValue(':name', $imageName, SQLITE3_TEXT);
$stmt->bindValue(':uploadtime', $uploadTime, SQLITE3INTEGER);
$stmt->bindValue(':uploaderip', $uploaderIP, SQLITE3TEXT);
$stmt->bindValue(':imagedata', $compressedImageData, SQLITE3BLOB);
$stmt->execute();

$uploadResults[] = [
'name' => $imageName,
'md5' => $md5Hash,
'status' => 'success'
];
} else {
$uploadResults[] = [
'name' => $imageName,
'md5' => $md5Hash,
'status' => 'duplicate'
];
}
$db->close();
} else {
$uploadResults[] = [
'name' => $file['name'][$key],
'md5' => null,
'status' => 'error'
];
}
}
}

// 处理图像显示
if (isset($_GET['md5'])) {
$md5 = $_GET['md5'];
$dbPath = "$imgRoot/$md5.db";

if (file_exists($dbPath)) {
$db = new SQLite3($dbPath);
$stmt = $db->prepare("SELECT name, image_data FROM images WHERE md5 = :md5");
$stmt->bindValue(':md5', $md5, SQLITE3_TEXT);
$result = $stmt->execute();
$row = $result->fetchArray(SQLITE3_ASSOC);

if ($row) {
header("Content-Disposition: inline; filename=\"" . $row['name'] . "\"");
header("Content-Type: image/" . pathinfo($row['name'], PATHINFO_EXTENSION));
echo gzuncompress($row['image_data']);
exit;
}
$db->close();
} else {
echo "图像未找到。";
exit;
}
}
?>

图片上传

上传图片



张图片上传成功!
已存在,点击查看:
上传失败