谷歌浏览器文件下载了缓存的问题与解决方案
前言:最近寫了一個文件下載的接口,我測試下能下載文件后就提交了到了生產,然后然后使用下載功能的小伙伴找到我說下載有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。
總結
以上是生活随笔為你收集整理的谷歌浏览器文件下载了缓存的问题与解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开发 调试
- 下一篇: 支付宝新版SDK-PC扫码支付-手机浏览