import json import os import shutil from pathlib import Path from typing import List import redis from fastapi import FastAPI, UploadFile app = FastAPI() UPLOAD_DIR = "data" OUTPUT_DIR = "converted" os.makedirs(UPLOAD_DIR, exist_ok=True) os.makedirs(OUTPUT_DIR, exist_ok=True) redis_client = redis.StrictRedis(host="localhost", port=6379, decode_responses=True) @app.post("/upload/") async def upload_directory(files: List[UploadFile]): """사용자가 여러 개의 파일을 업로드하면 UPLOAD_DIR에 저장""" uploaded_files = [] for file in files: file_path = Path(UPLOAD_DIR) / file.filename with open(file_path, "wb") as buffer: shutil.copyfileobj(file.file, buffer) uploaded_files.append(file.filename) return {"message": "파일 업로드 성공", "files": uploaded_files} @app.get("/convert/") async def convert_files(): """ 업로드된 파일들을 지원하는 확장자(txt, html, docx, pdf)만 Redis 작업 큐에 태스크로 등록. 워커에서 배치 잡으로 처리합니다. """ files = os.listdir(UPLOAD_DIR) enqueued_tasks = [] for file in files: file_ext = file.split(".")[-1].lower() # 지원하는 파일 형식만 큐에 넣기 if file_ext in ["txt", "html", "docx", "pdf"]: task = { "filename": file, "extension": file_ext, "input_path": os.path.join(UPLOAD_DIR, file), "output_path": os.path.join(OUTPUT_DIR, f"{Path(file).stem}.md"), } # 태스크를 JSON 문자열로 변환하여 큐에 등록 redis_client.lpush("task_queue", json.dumps(task)) enqueued_tasks.append(task) return {"message": "작업이 큐에 추가되었습니다.", "tasks": enqueued_tasks} @app.get("/download/{filename}") async def download_file(filename: str): """변환된 Markdown 파일을 다운로드할 수 있도록 제공""" file_path = Path(OUTPUT_DIR) / filename if not file_path.exists(): return {"error": "파일이 존재하지 않습니다."} return file_path.read_text(encoding="utf-8")