1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
| import os import uuid import time from datetime import datetime as dt from fastapi import FastAPI, File, UploadFile, Depends, Query from fastapi.middleware.cors import CORSMiddleware from sqlalchemy.orm import Session from models import SessionLocal, OCRResult from starlette.responses import FileResponse from fastapi.staticfiles import StaticFiles
from config import KAFKA_HOST, KAFKA_PORT, KAFKA_TOPIC
from kafka import KafkaProducer
producer = KafkaProducer(bootstrap_servers=f'{KAFKA_HOST}:{KAFKA_PORT}')
app = FastAPI()
app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], )
STATIC_FOLDER = "static" UPLOAD_FOLDER = f"{STATIC_FOLDER}/uploads" os.makedirs(UPLOAD_FOLDER, exist_ok=True) os.makedirs(STATIC_FOLDER, exist_ok=True)
app.mount("/static", StaticFiles(directory=STATIC_FOLDER), name="static")
@app.get("/") async def serve_homepage(): return FileResponse("static/upload.html")
def get_db(): db = SessionLocal() try: yield db finally: db.close()
@app.post("/upload/") async def upload_image(file: UploadFile = File(...), db: Session = Depends(get_db)): start_time = time.time()
file_extension = file.filename.split(".")[-1] unique_id = str(uuid.uuid4()) save_path = os.path.join(UPLOAD_FOLDER, f"{unique_id}.{file_extension}")
with open(save_path, "wb") as image_file: image_file.write(file.file.read())
elapsed_time = time.time() - start_time
db_result = OCRResult( uuid=unique_id, filename=file.filename, filepath=save_path, ocr_text=None, start_time=dt.now(), status=0, elapsed_time=0.0 ) db.add(db_result) db.commit()
producer.send(KAFKA_TOPIC, key=unique_id.encode(), value=save_path.encode())
return { "uuid": unique_id, "filename": file.filename, "ocr_text": None, "elapsed_time": elapsed_time }
@app.get("/results/") def get_results( db: Session = Depends(get_db), filename: str = Query(None, title="文件名", description="搜索 OCR 记录的文件名"), sort_by_time: bool = Query(False, title="按时间排序", description="是否按时间倒序排序") ): query = db.query(OCRResult)
if filename: query = query.filter(OCRResult.filename.contains(filename))
if sort_by_time: query = query.order_by(OCRResult.start_time.desc())
results = query.all()
return [ { "uuid": result.uuid, "filename": result.filename, "filepath": f"uploads/{os.path.basename(result.filepath)}", "ocr_text": result.ocr_text, "start_time": result.start_time.strftime("%Y-%m-%d %H:%M:%S"), "status": "已完成" if result.status else "进行中", "elapsed_time": result.elapsed_time, } for result in results ]
if __name__ == "__main__": import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000, reload=True)
|