FastApi下载文件

记得之前我们讲过生成excel文件的事情,那么如何把服务器生成的excel文件正确发送给用户呢?

今天我们就来说说在FastApi中如何正确让用户下载到想要的文件。

基本流程

其实文件下载的场景还是挺多的,比如我想要拿到我这个用户最近10天创建的测试用例数据,那么我们服务端应该怎么做呢?

  1. 根据条件筛选出正确的数据
  2. 处理数据,生成对应的目标格式文件,比如csv,xlsx等等
  3. 返回http响应,其中指定response的内容和类型

温馨提示

现在假设我们已经完成了之前的步骤,并且生成了一个临时文件

需要注意的是,临时文件的名字为了确保唯一性,最好是用时间戳+随机字符串,或者懒一点可以用uuid

这里为了方便,我就编写一个简便的方法:

import time
import random random_str = list("abcdefgh")
random.shuffle(random_str)
filename = f"{time.time_ns()}_{''.join(random_str)}"

取当前时间戳(精确到纳秒),这时候还是有可能会有同一请求发生,所以我们再用random.shuffle对我们想要加的字符串进行随机排序(打乱顺序)。

这样一来,文件重名的概率就小了非常多,如果要严谨的话,可以把字符串放长点,但是文件名也会拖很长。

记得一定要保存这个随机的文件名,并且加上文件后缀哈~!

FastApi怎么做呢

其实文件也是HTTP的响应之一,只不过它相对特殊。

在FastApi中,响应有Response和FileResponse等多种,我们暂时看Response和FileResponse即可。

Response是我们常见的类型,当然fastapi比较友好,你如果return 一个字典,会默认将之转换为JSON Response。

但当你要设置返回的http状态码,那就需要去操作这个Response对象了。

我们常见的比如403 forbidden,401未认证,都可以用Response来实现。


那么对于FileResponse,我们怎么用呢?

其实用法比较简单,我们来看实战:

from fastapi import FastAPI
from starlette.responses import FileResponse app = FastAPI(name="monitor") @app.get("/download")
async def download():
# 处理完毕文件以后,生成了文件路径
filename = "你要下载的文件路径.xls"
return FileResponse(
filename, # 这里的文件名是你要发送的文件名
filename="lol.exe", # 这里的文件名是你要给用户展示的下载的文件名,比如我这里叫lol.exe
)

这样,前端页面提供一个a标签,href地址填对应的接口地址就好了。

<!DOCTYPE html>
<html>
<head>
<title>测试</title>
</head>
<body>
<!-- 这个地址用你的host:port加上接口地址-->
<a href="http://localhost:7777/download">下载文件</a>
</body>
</html>

等等 好像少了点啥

我们这个生成的文件虽然说都是随机的,没啥影响。但是如果一直有人生成,那不删除真的大丈夫吗?

所以我们得考虑下怎么删除文件~

  • 理所当然认为try finally

    答案是行不通的,因为finally的内容会在return之前进行。如果这时候你删除了文件,那么Response就返回不了文件了,会报错。

    还好我们FastApi原生提供了background功能,幕后工作人员会在执行完毕之后进行一些暗箱操作

    所以我们可以这么改动:

from starlette.background import BackgroundTask

        return FileResponse(
filename,
filename="application.xls",
background=BackgroundTask(lambda: os.remove(filename)),
)

使用background接受一个参数BackgroundTask,里面参数是一个无参方法:

lambda: os.remove(filename)

也就是删除这个文件的方法。

最后

flask的相关文件下载可以看博主几年前写的文章,原理都通用。

https://www.cnblogs.com/we8fans/p/7107353.html

FastApi下载文件的更多相关文章

  1. Java下载文件(流的形式)

    @RequestMapping("download") @ResponseBody public void download(HttpServletResponse respons ...

  2. 使用批处理文件在FTP服务器 上传下载文件

    1.从ftp服务器根目录文件夹下的文件到指定的文件夹下 格式:ftp -s:[配置文件] [ftp地址] 如:ftp -s:c:\vc\ftpconfig.txt   192.168.1.1 建立一个 ...

  3. 通过form表单的形式下载文件。

    在项目中遇到问题,要求动态拼接uri下载文件.但是由于项目的安全拦截导致window.location.href 和 window.open等新建窗口的方法都不行. 无意间百度到了通过form表单来下 ...

  4. SecureCRT上传和下载文件

    SecureCRT上传和下载文件(下载默认目录) SecureCR 下的文件传输协议有ASCII .Xmodem .Ymodem .Zmodem ASCII:这是最快的传输协议,但只能传送文本文件. ...

  5. HTTP 错误 404.3 – Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。

    今天,在vs2013中新建了一个placard.json文件,当我用jq读取它的时候,去提示404,直接在浏览器访问这个文件,提示: HTTP 错误 404.3 – Not Found 由于扩展配置问 ...

  6. FTP下载文件失败

    这几天的定时任务下载文件的脚本失败了. 于是手工执行测试,发现报550 Permission denied. Passive mode refused. 意思就是被动模式下,没有权限获取文件. 解决方 ...

  7. 如何使用FileZilla上传和下载文件

    一.使用FileZilla上传文件 1 打开 FileZilla 按照如下图所示,填写远程 Linux 的 IP ,用户名,密码,还有端口号(默认22) 2 选中左边需要上传的文件,然后拖到右边,等待 ...

  8. 开发板tftp下载文件

    搭建过程: 1.安装相关软件包:tftpd(服务端),tftp(客户端),xinetd sudo apt-get install tftpd tftp xinetd 2.建立配置文件(蓝色的目录是可以 ...

  9. Linux上传下载文件快捷命令

    远程链接Linux(如SecrueCRT),要上传文件很下载文件到Linux服务器,只需要使用sz或者rz命令即可快速下载和上传文件了. 使用方法: 1.首先确保Linux服务器系统中安装了lrzsz ...

随机推荐

  1. 几分钟就能学会的Python虚拟环境教程

    什么是虚拟环境 我们在使用Python的时候,通常用pip来进行包管理.比如我们要安装一个叫requests的库,那么我们就会采用以下命令去安装: pip install requests 那你知道, ...

  2. Redis之品鉴之旅(五)

    Redis事务 原子性:就是最小的单位 一致性:好多命令,要么全部执行成功,要么全部执行失败 隔离性:一个会话和另一个会话之间是互相隔离的 持久性:执行了就执行了,数据保存在硬盘上 典型例子:银行转账 ...

  3. VUE自学日志01-MVC和MVVM

    一.需要了解的基础概念 Model(M)是指数据模型,泛指后端进行的各种业务逻辑处理和数据操控,主要围绕数据库系统展开.这里的难点主要在于需要和前端约定统一的接口规则. View(V)是视图层,也就是 ...

  4. 常见错误0xCCCCCCCCC 读取字符串的字符时出错及其引申。

    问题描述在一个函数调用中,使用二级指针作为函数参数,传递一个字符串指针数组,但是在访问的时候,却出现了运行时错误,具体表现为"0xCCCCCCCC 读取字符串的字符时出错". 第一 ...

  5. NOIP模拟72

    T1 出了个大阴间题 解题思路 看了看数据,大概是个状压 DP,但是感觉记忆化搜索比较好写一点(然而并不是这样递归比迭代常熟大了许多..) 不难判断出来 b 的数值与合并的顺序无关于是我们可以预先处理 ...

  6. 算法——快速排序迭代式和递归式的Java实现

    快速排序迭代式和递归式的Java实现 快速排序基于分治法的思想,在待排序表中任选一值作为中枢值 pivot,一趟快排将所有大于该值的元素置于一边,小于该值的元素置于另一边,这样一个元素在排序中的最终位 ...

  7. IL合集

    由于之前写的表达式树合集,未编写任何注释且是以图片的形式展现给大家,在这里向各位看官道歉了,接下来为大家奉上新鲜出炉的香喷喷的IL合集,后面会持续更新,各位看官点关注不迷路,之前答应的手写IOC以及多 ...

  8. [no code][scrum meeting] Beta 6

    $( "#cnblogs_post_body" ).catalog() 例会时间:5月19日11:30,主持者:黎正宇 下次例会时间:5月20日11:30,主持者:彭毛小民 一.工 ...

  9. 『学了就忘』Linux基础 — 4、VMware安装

    目录 1.VMware介绍 2.VMware主要特点 3.VMware建议配置 4.VMware安装 1.VMware介绍 VMware是一个虚拟PC的软件,可以在现有的操作系统上虚拟出一个新的硬件环 ...

  10. STM32串口USART的使用方法和程序

    通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换. USART利用分数波特率发生器提供宽范围的波特率选择,支持同步单向通信和半 ...