Blackaay-blog
主页
(current)
浏览器缓存对下载文件的影响
创建于: 浏览量:550
今天做的一个小功能,页面中下载文件,每次下载给文件计数。调试时发现,第一次下载文件后,文件下载次数就不再变化。起初,检查了控制器的代码逻辑后,发觉没有问题。于是准备换成Chrome进行调试,因为从学习时起,就一直使用的Firefox,直至现在我依然是以Firefox作为浏览器进行开发的,Firefox独特的盒子模型,经常能够检验出一些前端的页面不兼容的情况,同时,Firefox比较特别的设置,使得我经常能够发觉一些使用Chrome所不容易注意到的点。这一次也是如此。 不出所料,Chrome一切正常,那证明代码的问题“不是很大”,这时“浏览器缓存”的想法突然出现在脑海里。就像电脑出问题,人们第一时间想着的是重启电脑一样,代码出问题,码农第一个想要甩锅的对象就是“缓存”,下意识Ctrl+F5一下就觉得能解决问题。 当然作为Level2的码农小白,我想到的是缓存使得浏览器并没有去请求服务端的文件,而是“贴心”直接丢给用户浏览器村下来的旧文件。 > 通过增加额外的唯一参数,欺骗浏览器这是一次新的请求 说实话,浏览器的缓存机制,我还不是特别清楚,这里还未有通过代码合理科学管理浏览器缓存时间机制的方法(等研究明白了一定补上,这里挖个坑),于是就简单粗暴的直接想要浏览器忽略缓存文件,每次去请求新的文件。 原本的文件下载请求,使用get请求,请求地址url类似`<a href="/file/getfile/123">`,123为文件的id,每一次请求都是这种同样的参数,短时间内二次请求时,浏览器就不会真正去访问服务器端的文件了。因此我们要加一个参数,要让浏览器误认为每次都是一个新的请求。 加什么最好?当然是时间戳`<a href="/file/getfile/123/1530715638">`,那这个href就只能是页面中的js生成的了。于是我就掉入了另一个坑。 > Ajax无法用于请求下载文件 js请求,我想当然的用了ajax; ```php <a onclick="getFile($fileId)"></a>//这里的$fileId,是文件id <script> function getFile(fileId){ var time = mew Date().getTime();//时间戳精确到微妙 $.get('/file/getfile/'+fileID+'/'+time); } </script> ``` 运行之后,没有反应,黑人问号脸... >拿来就用 原来,ajax并不能接收文件的二进制流形式的数据,只能改作: ```php <a onclick="getFile($fileId)"></a>//这里的$fileId,是文件id <script> function getFile(fileId){ var time = mew Date().getTime();//时间戳精确到微妙 window.location.href = '/file/getfile/'+fileID+'/'+time; } </script> ``` OK,大功告成。