近日领导提出在服务器的视频文件修改的情况下,客户端仍然播放的是老的视频文件,甚至服务器端视频文件已经不存在了,客户端打开仍然可以播放,只不过还是播放的老的视频文件。要求每次播放从服务器下载,而不是播放缓存中的文件。我第一反应是不可能吧。视频文件的缓存是浏览器控制的,服务器端怎么能控制。这时领导就说优酷他们的视频为什么每次播放都是最新的,而不是缓存中的。我当时就想说,优酷他们有自己开发的播放器,这可能是它的一个功能吧,咱们哪有,但是这话最终没说,最终憋出一句,我研究研究
由于网站使用的是jplayer播放插件,首先在jplayer官方网站找解决缓存的方法。文档中找不到。
然后想在服务器上进行视频文件缓存限制。找到了一种方法。在 asp.net 的 web.config 中可以加入缓存的限制,就是不缓存。但是设置测试的结果并没什么卵用,该播放本地的还是播放本地的。
晚上回家的路上想到了以前对某些网页不缓存的处理,就是在url后加一个时间戳,这样就不会缓存了。不知对视频文件起不起作用。第二天来到公司后进行测试。我们网站的视频文件都是 mp4 格式的,因此我在 javascript mp4 格式的文件请求的后面加了时间戳,初步测试,有效,换了视频文件,然后播放就变换为新的了。如果视频文件删除,则不会播放。这是领导来对我说,他问了一个朋友,他们处理这个问题的方法是每次改视频文件后改名字,这样就不会播放缓存中的了,让我试试这种方法。由于领导说的这种更改视频文件名的方法改动比较大。我们网站视频文件名的生成是按 ID 生成的,要修改就会要动多个地方,太麻烦,因此我没同意,我说我再找找,要没合适的就用改文件名的方法。
领导走后我又换了几个浏览器进行详细测试,最终确认这种加时间戳的方法是有效的,最终确认了这种禁用缓存的方法。
javascript url加缓存的函数:
/* * 解决浏览器缓存 */ function timestamp(url) { // var getTimestamp=Math.random(); var getTimestamp = new Date().getTime(); if (url.indexOf("?") > -1) { url = url + "×tamp=" + getTimestamp } else { url = url + "?timestamp=" + getTimestamp } return url; }