unoconvert / app.py
pvanand's picture
Update app.py
b5f85d0 verified
from fastapi import FastAPI, UploadFile, HTTPException
from fastapi.responses import FileResponse
import subprocess
import os
import shutil
from pathlib import Path
import uuid
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI(title="Document Conversion API")
# Create directories for file handling
UPLOAD_DIR = Path("uploads")
OUTPUT_DIR = Path("outputs")
UPLOAD_DIR.mkdir(exist_ok=True)
OUTPUT_DIR.mkdir(exist_ok=True)
@app.post("/convert/")
async def convert_document(
file: UploadFile,
output_format: str,
filter_options: str = None
):
try:
# Generate unique filenames
input_filename = f"{uuid.uuid4()}_{file.filename}"
output_filename = f"{Path(input_filename).stem}.{output_format}"
input_path = UPLOAD_DIR / input_filename
output_path = OUTPUT_DIR / output_filename
# Save uploaded file
with open(input_path, "wb") as buffer:
shutil.copyfileobj(file.file, buffer)
# Prepare conversion command
command = ["unoconvert"]
if filter_options:
command.extend(["--filter-options", filter_options])
command.extend([str(input_path), str(output_path)])
# Execute conversion
process = subprocess.run(
command,
capture_output=True,
text=True
)
if process.returncode != 0:
raise HTTPException(
status_code=500,
detail=f"Conversion failed: {process.stderr}"
)
# Return converted file
return FileResponse(
path=output_path,
filename=output_filename,
media_type="application/octet-stream"
)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
finally:
# Cleanup
if input_path.exists():
input_path.unlink()
if output_path.exists():
output_path.unlink()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
from fastapi.staticfiles import StaticFiles
app.mount("/", StaticFiles(directory="static/ui", html=True), name="index")
@app.get("/health")
async def health_check():
return {"status": "healthy"}