algorembrant's picture
Upload 63 files
c5ef85d verified
import os
import shutil
from pathlib import Path
from typing import List
from fastapi import FastAPI, UploadFile, File, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi.responses import FileResponse
app = FastAPI()
# Configure CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # In production, replace with specific origin
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Directories
BASE_DIR = Path(__file__).parent.absolute()
UPLOAD_DIR = BASE_DIR / "[2]_Drop_xlsx_here"
OUTPUT_DIR = BASE_DIR / "[4]_output_csv_files"
# Ensure directories exist
UPLOAD_DIR.mkdir(exist_ok=True)
OUTPUT_DIR.mkdir(exist_ok=True)
@app.get("/")
async def root():
return {"message": "MTParsee Backend Running"}
@app.post("/upload")
async def upload_file(file: UploadFile = File(...)):
if not file.filename.endswith(('.xlsx', '.xls')):
raise HTTPException(status_code=400, detail="Only Excel files are allowed")
file_path = UPLOAD_DIR / file.filename
try:
with open(file_path, "wb") as buffer:
shutil.copyfileobj(file.file, buffer)
return {"filename": file.filename, "message": "File uploaded successfully"}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/processed")
async def list_processed_folders():
"""List all result folders in the output directory"""
if not OUTPUT_DIR.exists():
return []
results = []
# Sort by modification time, newest first
items = sorted(OUTPUT_DIR.iterdir(), key=os.path.getmtime, reverse=True)
for item in items:
if item.is_dir() and item.name.startswith("Upload-"):
# Count files in the folder
file_count = len(list(item.glob("*.*")))
results.append({
"id": item.name,
"name": item.name,
"created": item.stat().st_mtime,
"file_count": file_count
})
return results
@app.get("/processed/{folder_id}")
async def list_folder_contents(folder_id: str):
folder_path = OUTPUT_DIR / folder_id
if not folder_path.exists():
raise HTTPException(status_code=404, detail="Folder not found")
files = []
for item in folder_path.iterdir():
if item.is_file():
files.append({
"name": item.name,
"size": item.stat().st_size,
"path": f"download/{folder_id}/{item.name}"
})
return files
@app.get("/download/{folder_id}/{filename}")
async def download_file(folder_id: str, filename: str):
file_path = OUTPUT_DIR / folder_id / filename
if not file_path.exists():
raise HTTPException(status_code=404, detail="File not found")
return FileResponse(path=file_path, filename=filename, media_type='application/octet-stream')
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)