谷歌浏览器文件下载了缓存的问题与解决方案
前言:最近写了一个文件下载的接口,我测试下能下载文件后就提交了到了生产,然后然后使用下载功能的小伙伴找到我说下载有bug,我明明修改了文件内容重新下载后还是以前的数据,吓得我赶紧去看代码,终于让我发现了问题。一、基础框架后端:python3.8 + flask + flask-restful前端:vue二、场景:有一个功能界面需要上传下载文件,且支持更改新的上传文件文件上传:通过request.f
前言:最近写了一个文件下载的接口,我测试下能下载文件后就提交了到了生产,然后然后使用下载功能的小伙伴找到我说下载有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。
更多推荐
所有评论(0)