How do I return an excel file (version: Office365) using FastAPI? The documentation seems pretty straightforward. But, I don't know what media_type
to use. Here's my code:
import os
from fastapi import FastAPI
from fastapi.responses import FileResponse
from pydantic import BaseModel
from typing import Optional
excel_file_path = r"C:\Users\some_path\the_excel_file.xlsx"
app = FastAPI()
class ExcelRequestInfo(BaseModel):
client_id: str
@app.post("/post_for_excel_file/")
async def serve_excel(item: ExcelRequestInfo):
# (Generate excel using item.)
# For now, return a fixed excel.
return FileResponse(
path=excel_file_path,
# Swagger UI says 'cannot render, look at console', but console shows nothing.
media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
# Swagger renders funny chars with this argument:
# 'application/vnd.ms-excel'
)
Assuming I get it right, how to download the file? Can I use Swagger UI (OpenAPI docs) generated by FastAPI to view the sheet? Or, curl? Ideally, I'd like to be able to download and view the file in Excel.
CodePudding user response:
You could set the Content-Disposition
header using the attachment
parameter, indicating to the browser that the file should be downloaded, as described in the answers here and here. Swagger UI will provide a Download file
link for you to download the file, as soon as you execute the request.
headers = {'Content-Disposition': 'attachment; filename="Book.xlsx"'}
return FileResponse(excel_file_path, headers=headers)
To have the file viewed in the browser, one can use the inline
parameter in the Content-Disposition
header. However, one should set the correct media_type
in the FileResponse
(for Excel files see here), as well as .xlsx
(or .xls
) must be a known file extension to the browser.