文章详情

返回首页

servoo图床-php

分享文章 作者: Ws01 创建时间: 2025-11-24 更新时间: 2025-12-28 📝 字数: 11,089 字 👁️ 阅读: 51 次
servoo图床-php
<?php
$imgRoot = './img9527abc'; // 务必修改此处!!图像存储根路径
if (!is_dir($imgRoot)) {
    if (is_readable($imgRoot)) {
        trigger_error("{$imgRoot} 不是有效的目录", E_USER_NOTICE);
    } else {
        mkdir($imgRoot, 0777, true);
    }
}

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

// 处理图像上传
$uploadResults = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['images'])) {
    foreach ($_FILES['images']['tmp_name'] as $key => $tmpName) {
        $file = $_FILES['images'];
        if ($file['error'][$key] === UPLOAD_ERR_OK) {
            $imageData = file_get_contents($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, upload_time, uploader_ip, image_data) VALUES (:md5, :name, :upload_time, :uploader_ip, :image_data)");
                $stmt->bindValue(':md5', $md5Hash, SQLITE3_TEXT);
                $stmt->bindValue(':name', $imageName, SQLITE3_TEXT);
                $stmt->bindValue(':upload_time', $uploadTime, SQLITE3_INTEGER);
                $stmt->bindValue(':uploader_ip', $uploaderIP, SQLITE3_TEXT);
                $stmt->bindValue(':image_data', $compressedImageData, SQLITE3_BLOB);
                $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;
    }
}
?>

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <link rel="icon" href="./img9527abc/logo-01.png" />
    <title>图片上传</title>
    <style>
body {
    font-family: Arial, sans-serif;
    background-image: url('https://img.9527.nyc.mn');
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
    opacity: 0.8; /* 调整透明度 */
    margin: 0;
    padding: 0;
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    flex-direction: column;
}

.footer {
font-size:15px;
color:#ffffff;
margin:15px auto;
}

        .container {
            background-color: white;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
            width: 100%;
            max-width: 500px;
            text-align: center;
        }
        h1 {
            margin-bottom: 20px;
        }
        input[type="file"] {
            display: none;
        }
        .custom-file-upload {
            border: 1px solid #ccc;
            display: inline-block;
            padding: 8px 12px;
            cursor: pointer;
            background-color: #007bff;
            color: white;
            border-radius: 4px;
        }
        button {
            background-color: #28a745;
            color: white;
            border: none;
            padding: 10px 20px;
            border-radius: 4px;
            cursor: pointer;
            font-size: 16px;
        }
        button:hover {
            background-color: #218838;
        }
        .message {
            margin-top: 20px;
            color: #333;
        }
        .preview-container img {
            width: 100px;
            height: 100px;
            object-fit: cover;
            margin: 10px;
            border-radius: 4px;
        }
        .result-container {
            margin-top: 20px;
        }
        .result-container a {
            display: block;
            margin-bottom: 5px;
        }
        .copy-success {
            font-size: 12px;
            color: green;
            margin-top: 5px;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>上传图片</h1>
        <form id="uploadForm" action="index.php" method="POST" enctype="multipart/form-data">
            <label for="images" class="custom-file-upload">选择图片</label>
            <input type="file" name="images[]" id="images" multiple required>
            <div class="preview-container" id="previewContainer"></div>
            <br><br>
            <button type="submit">上传</button>
        </form>
        <div class="message">
            <?php if ($uploadResults): ?>
                <?php $successCount = 0; ?>
                <?php foreach ($uploadResults as $result): ?>
                    <?php if ($result['status'] === 'success') $successCount++; ?>
                <?php endforeach; ?>
                <?= $successCount . ' / ' . count($uploadResults) ?> 张图片上传成功!
            <?php endif; ?>
        </div>
        <div class="result-container">
            <?php if ($uploadResults): ?>
                <?php foreach ($uploadResults as $result): ?>
                    <?php if ($result['status'] === 'success'): ?>
                        <div>
                            <a href="?md5=<?= $result['md5'] ?>" target="_blank" class="image-url"><?= $result['name'] ?></a>
                            <button class="copy-btn" data-url="?md5=<?= $result['md5'] ?>">复制链接</button>
                            <span class="copy-success"></span>
                        </div>
                    <?php elseif ($result['status'] === 'duplicate'): ?>
                        <div><?= $result['name'] ?> 已存在,点击查看:<a href="?md5=<?= $result['md5'] ?>" target="_blank"><?= $result['name'] ?></a></div>
                    <?php else: ?>
                        <div><?= $result['name'] ?> 上传失败</div>
                    <?php endif; ?>
                <?php endforeach; ?>
            <?php endif; ?>
        </div>
    </div>

<br />
<br />
<!-- body   https://img1.199881.xyz/file/cfa3e1a8179c6feb6ae2c.jpg和https://i0.img2ipfs.com/ipfs/QmPQX8EZRjXcW5kBmGpAF4XkLHJbCjzsd9zaiwhKAYJgsT    -->
<div class="footer">
                <a href="https://img.199881.xyz/" target="_blank">TG图床</a> | 

<!--            <a href="https://img.9527.us.kg/" target="_blank">serv00图床</a> |     -->
                <a href="https://ngohome.eu.org/" target="_blank">ngohome图床</a> |      
                <a href="https://freeimg.netlib.re/" target="_blank">nfreeimg图床</a> |      
<!--            <a href="https://freemjj.nyc.mn/" target="_blank">5G图床2</a> |      -->
<!--            <a href="https://ipfs.9527.us.kg/" target="_blank">ipfs图床</a>     -->
<br />
                <!-- 开站时间开始 -->       
<span id="timeDate">载入天数...</span>
            <script language="javascript"> 
            var now = new Date();
            function createtime(){
                var grt= new Date("01/05/2025 00:00:00");/*---这里是网站的启用时间--*/
                now.setTime(now.getTime()+250);
                days = (now - grt ) / 1000 / 60 / 60 / 24;
                dnum = Math.floor(days);
                document.getElementById("timeDate").innerHTML = "稳定运行"+dnum+"天";
            }
            setInterval("createtime()",250); 
        </script> 

        <span <p>  | 本页总访问量 <span id="busuanzi_site_pv"></span> 次 | @ws01</p></span>
        <script defer src="https://bsz.211119.xyz/js"></script>
<!-- 开站时间结束 -->  


    <script>
        const previewContainer = document.getElementById('previewContainer');
        const fileInput = document.getElementById('images');

        fileInput.addEventListener('change', () => {
            previewContainer.innerHTML = '';
            Array.from(fileInput.files).forEach(file => {
                const reader = new FileReader();
                reader.onload = function (e) {
                    const img = document.createElement('img');
                    img.src = e.target.result;
                    previewContainer.appendChild(img);
                };
                reader.readAsDataURL(file);
            });
        });

        document.querySelectorAll('.copy-btn').forEach(button => {
            button.addEventListener('click', function () {
                const url = this.getAttribute('data-url');
                const textarea = document.createElement('textarea');
                textarea.value = window.location.href.split('?')[0] + url;
                document.body.appendChild(textarea);
                textarea.select();
                document.execCommand('copy');
                document.body.removeChild(textarea);
                this.nextElementSibling.textContent = '复制成功!';
            });
        });
    </script>
</body>
</html>

留言

暂无留言

0 / 100