#!/usr/bin/env python3
"""
简单的上传与触发服务(FastAPI)
提供:
GET / -> 上传页面
POST /upload -> 上传文件(multipart)
POST /run -> 手动触发 process_report.py
部署时请确保 INPUT_DIR 与 OUTPUT_DIR 与 process_report.py 一致
"""
import os
import shutil
import subprocess
from fastapi import FastAPI, UploadFile, File, Form
from fastapi.responses import HTMLResponse, JSONResponse
import uvicorn
INPUT_DIR = os.environ.get('INPUT_DIR', '/data/uploads')
OUTPUT_DIR = os.environ.get('OUTPUT_DIR', '/data/outputs')
os.makedirs(INPUT_DIR, exist_ok=True)
os.makedirs(OUTPUT_DIR, exist_ok=True)
app = FastAPI()
@app.get('/', response_class=HTMLResponse)
async def index():
# 这里直接返回 HTML 内容,不需要 templates 文件夹
return HTMLResponse('''
采购执行表自动化 - 上传
采购执行表自动化 - 上传页面
上传后,系统将按计划自动处理或可通过API手动触发。
''')
@app.post('/upload')
async def upload(file: UploadFile = File(...)):
save_path = os.path.join(INPUT_DIR, file.filename)
with open(save_path, 'wb') as f:
content = await file.read()
f.write(content)
return JSONResponse({'status': 'ok', 'saved': save_path, 'message': f'文件 {file.filename} 上传成功!'})
@app.post('/run')
async def run_once():
# 调用核心处理脚本
proc = subprocess.run(['python', '/workspace/process_report.py'], capture_output=True, text=True)
if proc.returncode == 0:
return JSONResponse({'status': 'ok', 'returncode': proc.returncode, 'stdout': proc.stdout, 'stderr': proc.stderr})
else:
return JSONResponse({'status': 'error', 'returncode': proc.returncode, 'stdout': proc.stdout, 'stderr': proc.stderr}, status_code=500)
if __name__ == '__main__':
uvicorn.run(app, host='0.0.0.0', port=7860)