前言:最近写了一个文件下载的接口,我测试下能下载文件后就提交了到了生产,然后然后使用下载功能的小伙伴找到我说下载有bug,我明明修改了文件内容重新下载后还是以前的数据,吓得我赶紧去看代码,终于让我发现了问题。

一、基础框架

后端:python3.8 + flask + flask-restful

前端:vue

二、场景:有一个功能界面需要上传下载文件,且支持更改新的上传文件

文件上传:通过request.files 获取到文件流,os.makedirs创建文件存储目录, file.save(filepath)保存,另外保存一条文件上传记录,涵盖文件名,文件保存路径等等,貌似一切都ok

文件下载: 通过前端界面获取到当前记录的文件名,通过文件名查找文件信息,找到文件目录filepath

response = make_response(send_from_directory(filepath, fullflname, as_attachment=True))
获取到response对象,返回文件流

三、当修改新的上传文件为B时,点击下载 还是获取的之前文件A,清理浏览器缓存后,点击下载,文件为B,这才是正确的
在这里插入图片描述

四、经过一系列资料查询,得知,谷歌会对文件下载进行缓存的

解决方法: 在下载获取到response对象后,增加headers 设置 cache-controll = “no-store“
在这里插入图片描述
重新下载文件查看接口请求头发现问题已经解决了
在这里插入图片描述

五、Cache-Control详解

服务器标记资源有效期使用的头字段是“Cache-Control”,里面的值“max-age=43200”就是资源的有效时间,相当于告诉浏览器,“这个页面只能缓存 43200秒,之后就算是过期,不能用。
no-cache — 强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验。这对于需要确认认证应用很有用(可以和public结合使用),或者严格要求使用最新数据 的应用(不惜牺牲使用缓存的所有好处)。
Pragma 当”no-cache”出现在请求消息中时,应用程序应当向原始服务器推送此请求,即使它已经在上次请求时已经缓存了一份拷贝。这样将保证客户端能接收到最权威的回应。它也用来在客户端发现其缓存中拷贝不可用或过期时,对拷贝进行强制刷新。
max-age>0:直接从游览器缓存中 提取。
max-age<=0:向server 发送http 请求确认 ,该资源是否有修改,有的话 返回200 ,无的话 返回304。

Logo

前往低代码交流专区

更多推荐