# python3 -m pip install Flask
import base64
import binascii
import os
import re
import uuid
from pathlib import Path
from flask import Flask, request, Response
app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = 28 * 1024 * 1024
DIRECTORY = Path(os.environ.get('UPLOAD_DIR', Path(__file__).parent / 'uploads'))
DIRECTORY.mkdir(parents=True, exist_ok=True)
def reply(text, status=200):
    return Response(text, status=status, mimetype='text/plain')
def extension(data):
    if data.startswith(b'\xff\xd8\xff'): return 'jpg'
    if data.startswith(b'\x89PNG\r\n\x1a\n'): return 'png'
    if data[:6] in (b'GIF87a', b'GIF89a'): return 'gif'
    if data[:4] == b'RIFF' and data[8:12] == b'WEBP': return 'webp'
    if data.startswith(b'%PDF-'): return 'pdf'
    return 'bin'
def save(data):
    if not data: return reply('错误：未接收到文件', 400)
    if len(data) > 20 * 1024 * 1024: return reply('错误：文件过大', 413)
    name = f'{uuid.uuid4().hex}.{extension(data)}'
    try:
        with (DIRECTORY / name).open('xb') as file:
            file.write(data)
    except OSError:
        return reply('错误：文件保存失败', 500)
    return reply('上传成功|' + name)
@app.post('/upload.php')
@app.post('/upload')
def upload():
    if request.mimetype == 'multipart/form-data':
        file = next(iter(request.files.values()), None)
        if file is None: return reply('错误：未接收到文件', 400)
        return save(file.read())
    return save(request.get_data())
@app.post('/upload_base64.php')
@app.post('/upload_base64')
def upload_base64():
    text = request.form.get('data', '') if request.mimetype == 'application/x-www-form-urlencoded' else request.get_data(as_text=True)
    if request.is_json:
        data = request.get_json(silent=True)
        if not isinstance(data, dict): return reply('错误：JSON 格式无效', 400)
        text = data.get('data', data.get('image_base64', ''))
    if not isinstance(text, str): return reply('错误：Base64 数据必须是文本', 400)
    text = re.sub(r'^data:[^;]+;base64,', '', text)
    text = re.sub(r'\s', '', text)
    try:
        data = base64.b64decode(text, validate=True)
    except (binascii.Error, ValueError):
        return reply('错误：Base64 解码失败', 400)
    return save(data)
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 3000)))
