FastApi下载文件
FastApi下载文件
记得之前我们讲过生成excel文件的事情,那么如何把服务器生成的excel文件正确发送给用户呢?
今天我们就来说说在FastApi中如何正确让用户下载到想要的文件。
基本流程
其实文件下载的场景还是挺多的,比如我想要拿到我这个用户最近10天创建的测试用例数据,那么我们服务端应该怎么做呢?
- 根据条件筛选出正确的数据
- 处理数据,生成对应的目标格式文件,比如csv,xlsx等等
- 返回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下载文件的更多相关文章
- Java下载文件(流的形式)
@RequestMapping("download") @ResponseBody public void download(HttpServletResponse respons ...
- 使用批处理文件在FTP服务器 上传下载文件
1.从ftp服务器根目录文件夹下的文件到指定的文件夹下 格式:ftp -s:[配置文件] [ftp地址] 如:ftp -s:c:\vc\ftpconfig.txt 192.168.1.1 建立一个 ...
- 通过form表单的形式下载文件。
在项目中遇到问题,要求动态拼接uri下载文件.但是由于项目的安全拦截导致window.location.href 和 window.open等新建窗口的方法都不行. 无意间百度到了通过form表单来下 ...
- SecureCRT上传和下载文件
SecureCRT上传和下载文件(下载默认目录) SecureCR 下的文件传输协议有ASCII .Xmodem .Ymodem .Zmodem ASCII:这是最快的传输协议,但只能传送文本文件. ...
- HTTP 错误 404.3 – Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
今天,在vs2013中新建了一个placard.json文件,当我用jq读取它的时候,去提示404,直接在浏览器访问这个文件,提示: HTTP 错误 404.3 – Not Found 由于扩展配置问 ...
- FTP下载文件失败
这几天的定时任务下载文件的脚本失败了. 于是手工执行测试,发现报550 Permission denied. Passive mode refused. 意思就是被动模式下,没有权限获取文件. 解决方 ...
- 如何使用FileZilla上传和下载文件
一.使用FileZilla上传文件 1 打开 FileZilla 按照如下图所示,填写远程 Linux 的 IP ,用户名,密码,还有端口号(默认22) 2 选中左边需要上传的文件,然后拖到右边,等待 ...
- 开发板tftp下载文件
搭建过程: 1.安装相关软件包:tftpd(服务端),tftp(客户端),xinetd sudo apt-get install tftpd tftp xinetd 2.建立配置文件(蓝色的目录是可以 ...
- Linux上传下载文件快捷命令
远程链接Linux(如SecrueCRT),要上传文件很下载文件到Linux服务器,只需要使用sz或者rz命令即可快速下载和上传文件了. 使用方法: 1.首先确保Linux服务器系统中安装了lrzsz ...
随机推荐
- Python读取ini配置文件(接口自动测试必备)
前言 大家应该接触过.ini格式的配置文件.配置文件就是把一些配置相关信息提取出去来进行单独管理,如果以后有变动只需改配置文件,无需修改代码. 特别是后续做自动化的测试,代码和数据分享,进行管理.比如 ...
- 【vue】生成接口模拟数据
目录 方案一:自定义模拟数据 Step1 创建json文件 Step2 在 vue.config.js 中配置 Step3 在组件中使用 (方式一) Step3 封装api (方式二) Step4 在 ...
- 实验4:开源控制器实践——OpenDaylight
实验4:开源控制器实践--OpenDaylight 一.实验目的 能够独立完成OpenDaylight控制器的安装配置: 能够使用Postman工具调用OpenDaylight API接口下发流表. ...
- C语言日记② 初识 C的内存
第一节: 上一个笔记 有趣的恶搞小程序 定时关机 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <str ...
- 其他css属性和特性
其他css属性和特性 设置元素的颜色和透明度 下表列出了这些属性. 颜色相关属性 属 性 说 明 值 color 设置元素的前景色 <颜色> opacity 设置颜色的透明度 <数值 ...
- HttpServletRequest 入门
1. request对象和response对象的原理 request和response对象是由服务器创建的.我们来使用它们 request对象是来获取请求消息,response对象是来设置响应消息 2 ...
- 浅尝装饰器-@staticmethod 和@classmethod
[写在前面] 本帖归属于装饰器单元的学习,可以点击关键词'装饰器'查看其他博文讲解 [正文部分] 说到装饰器一开始我觉得很陌生,看了一下别人的博客讲解,原来以前学习遇到的静态方法@staticmeth ...
- pycharm环境下配置scrap爬虫环境
[写在开头] 参考文章后面给出了备注信息,是在解决这个问题的时候,查找的比较有亮点的参考文章,如果本文章写的不太清楚的,可以去原文章进行查看.下面列举的四个文章有参考的成分也有验证的成分,解决办法重点 ...
- 【Java虚拟机4】Java内存模型(硬件层面的并发优化基础知识--缓存一致性问题)
前言 今天学习了Java内存模型第一课的视频,讲了硬件层面的知识,还是和大学时一样,醍醐灌顶.老师讲得太好了. Java内存模型,感觉以前学得比较抽象.很繁杂,抽象. 这次试着系统一点跟着2个老师学习 ...
- 【Java虚拟机1】Java字节码文件格式入门
第一次学习看字节码文件,这个对工作没什么用,但是会提升内功. 首先介绍两个IDEA插件以及使用: BinEd:以16进制格式查看class文件 使用方法:右键class文件,点击Open as bin ...