123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- from fastapi import APIRouter, UploadFile, File, BackgroundTasks
- from fastapi import Depends, HTTPException, status
- from starlette.responses import StreamingResponse
- from pydantic import BaseModel
- from utils.misc import calculate_sha256
- import requests
- import os
- import asyncio
- import json
- from config import OLLAMA_API_BASE_URL
- router = APIRouter()
- class UploadBlobForm(BaseModel):
- filename: str
- @router.post("/upload")
- async def upload(file: UploadFile = File(...)):
- os.makedirs("./uploads", exist_ok=True)
- file_path = os.path.join("./uploads", file.filename)
- def file_write_stream():
- total = 0
- total_size = file.size
- chunk_size = 1024 * 1024
- done = False
- try:
- with open(file_path, "wb") as f:
- while True:
- chunk = file.file.read(chunk_size)
- if not chunk:
- break
- f.write(chunk)
- total += len(chunk)
- done = total_size == total
- res = {
- "total": total_size,
- "uploaded": total,
- }
- yield f"data: {json.dumps(res)}\n\n"
- if done:
- with open(file_path, "rb") as f:
- hashed = calculate_sha256(f)
- f.seek(0)
- file_data = f.read()
- url = f"{OLLAMA_API_BASE_URL}/blobs/sha256:{hashed}"
- response = requests.post(url, data=file_data)
- if response.ok:
- res = {
- "done": done,
- "blob": f"sha256:{hashed}",
- }
- os.remove(file_path)
- yield f"data: {json.dumps(res)}\n\n"
- else:
- raise "Ollama: Could not create blob, Please try again."
- except Exception as e:
- res = {"error": str(e)}
- yield f"data: {json.dumps(res)}\n\n"
- return StreamingResponse(file_write_stream(), media_type="text/event-stream")
|