How to delete the file after a `return FileResponse(file_path)`
You can delete a file in a background task, as it will run after the response is sent.
import os
import tempfile
from fastapi import FastAPI
from fastapi.responses import FileResponse
from starlette.background import BackgroundTasks
app = FastAPI()
def remove_file(path: str) -> None:
os.unlink(path)
@app.post("/send")
async def send(background_tasks: BackgroundTasks):
fd, path = tempfile.mkstemp(suffix='.txt')
with os.fdopen(fd, 'w') as f:
f.write('TEST\n')
background_tasks.add_task(remove_file, path)
return FileResponse(path)
Another approach is to use dependency with yield. The finally
block code will be executed after the response is sent and even after all background tasks have been completed.
import os
import tempfile
from fastapi import FastAPI, Depends
from fastapi.responses import FileResponse
app = FastAPI()
def create_temp_file():
fd, path = tempfile.mkstemp(suffix='.txt')
with os.fdopen(fd, 'w') as f:
f.write('TEST\n')
try:
yield path
finally:
os.unlink(path)
@app.post("/send")
async def send(file_path=Depends(create_temp_file)):
return FileResponse(file_path)
Note: mkstemp() returns a tuple with a file descriptor and a path.