from flask import Flask, render_template_string, request, send_file, jsonify, redirect, url_for, session import os import sqlite3 import hashlib from datetime import datetime from pathlib import Path from PIL import Image import uuid import threading import time import random import shutil # 环境变量 ACCESS_PASSWORD = os.environ.get("ACCESS_PASSWORD", "changeme") HF_USERNAME = os.environ.get("HF_USERNAME", "") HF_SPACE_NAME = os.environ.get("HF_SPACE_NAME", "") # Flask应用 app = Flask(__name__) app.secret_key = os.environ.get("ACCESS_PASSWORD", "your-secret-key-change-this") # 文件存储路径 IMAGE_DIR = Path("uploaded_images") DB_PATH = "image_database.db" # 创建目录 IMAGE_DIR.mkdir(exist_ok=True) def init_db(): """初始化数据库""" try: conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() cursor.execute(""" CREATE TABLE IF NOT EXISTS images ( id INTEGER PRIMARY KEY AUTOINCREMENT, hash TEXT NOT NULL UNIQUE, filename TEXT NOT NULL, original_filename TEXT NOT NULL, file_path TEXT NOT NULL, file_size INTEGER, mime_type TEXT, upload_time TEXT NOT NULL, description TEXT ) """) cursor.execute(""" CREATE INDEX IF NOT EXISTS idx_hash ON images(hash) """) conn.commit() conn.close() print("数据库初始化成功") return True except Exception as e: print(f"数据库初始化失败: {e}") return False def get_db_connection(): conn = sqlite3.connect(DB_PATH) conn.row_factory = sqlite3.Row return conn def check_password(password): return password == ACCESS_PASSWORD def generate_image_hash(): return uuid.uuid4().hex[:12] def generate_filename(original_filename): timestamp = datetime.now().strftime('%Y%m%d_%H%M%S_%f') hash_suffix = hashlib.md5(str(datetime.now().timestamp()).encode()).hexdigest()[:8] ext = Path(original_filename).suffix.lower() if not ext: ext = ".png" return f"{timestamp}_{hash_suffix}{ext}" def generate_full_url(image_hash): """生成完整的图片URL""" if HF_USERNAME and HF_SPACE_NAME: return f"https://{HF_USERNAME}-{HF_SPACE_NAME}.hf.space/img/{image_hash}" else: return f"/img/{image_hash}" def keep_alive(): """防止系统休眠""" while True: sleep_time = random.randint(60, 120) time.sleep(sleep_time) print(f"[Keep-Alive] {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") # 初始化 init_db() keep_alive_thread = threading.Thread(target=keep_alive, daemon=True) keep_alive_thread.start() # HTML模板 HTML_TEMPLATE = """
点击选择图片(支持多选)
导出所有图片的元数据(包含完整URL)为JSON格式