Skip to content

Commit 73c6dab

Browse files
add download ability
1 parent 8913648 commit 73c6dab

1 file changed

Lines changed: 17 additions & 6 deletions

File tree

app.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import aiohttp
66
import asyncio
77
import bcrypt
8-
from fastapi import FastAPI, Request, Form
9-
from fastapi.responses import RedirectResponse, HTMLResponse
8+
from fastapi import FastAPI, Request, Form, Query
9+
from fastapi.responses import RedirectResponse, HTMLResponse, StreamingResponse
1010
from fastapi.staticfiles import StaticFiles
1111
from markupsafe import Markup
1212
from pydantic import BaseModel
@@ -206,6 +206,7 @@ async def create_redirect(request: Request, code: str = Form(...), password: str
206206

207207
import traceback
208208

209+
@app.head("/redirect/{key}", response_class=HTMLResponse)
209210
@app.get("/redirect/{key}", response_class=HTMLResponse)
210211
async def dynamic_redirect(request: Request, key: str):
211212
"""Dynamically handle redirects based on MongoDB data."""
@@ -232,8 +233,9 @@ async def dynamic_redirect(request: Request, key: str):
232233
return "The 'code' field is empty.", 400 # Bad request error for empty 'code'
233234
return "Handler function not found.", 404 # Not found error if document doesn't exist.
234235

235-
@app.head("/redirect/{key}", response_class=HTMLResponse)
236-
async def dynamic_redirect(request: Request, key: str):
236+
@app.head("/download/{key}", response_class=HTMLResponse)
237+
@app.get("/download/{key}", response_class=HTMLResponse)
238+
async def dynamic_download(request: Request, key: str, file_name: str = Query(..., description="The desired filename for the downloaded file")):
237239
"""Dynamically handle redirects based on MongoDB data."""
238240
collection = db.route_handlers
239241
document = await collection.find_one({"key": key})
@@ -243,7 +245,17 @@ async def dynamic_redirect(request: Request, key: str):
243245
if code:
244246
try:
245247
result = await execute_async_code(code)
246-
return RedirectResponse(url=result)
248+
249+
async with aiohttp.ClientSession() as session:
250+
async with session.get(result) as response:
251+
response.raise_for_status()
252+
content = await response.read()
253+
254+
return StreamingResponse(
255+
iter([content]),
256+
media_type=response.headers.get('Content-Type', 'application/octet-stream'),
257+
headers={'Content-Disposition': f'attachment; filename="{file_name}"'}
258+
)
247259
except Exception as e:
248260
# Extract the traceback from the exception
249261
tb_str = ''.join(traceback.format_exception(None, e, e.__traceback__))
@@ -259,7 +271,6 @@ async def dynamic_redirect(request: Request, key: str):
259271
return "Handler function not found.", 404 # Not found error if document doesn't exist.
260272

261273

262-
263274
# Run FastAPI with Uvicorn
264275
if __name__ == "__main__":
265276
import uvicorn

0 commit comments

Comments
 (0)