第一种方式(使用a标签,且url就是文件下载地址):php
<a href = "http://localhost/upload/文件名">文件名</a> //点击该链接后会自动下载
优势:简单、方便、快捷、代码量最小ajax
缺点:下载下来的文件与路径名始终保持一致,没法由程序分别指定,且一旦文件不存在,就会跳转或刷新页面app
第二种方式(使用a标签,url指向php控制器,由php设置header后进行下载)编码
<a href="<?php echo "http://myController/download? file_url=$file_url&file_realname=$file_realname":'');?>"><?php echo $file_realname;?></a> //点击该链接后会自动下载
在myController的download()方法中进行header设置url
$file_url = request('file_url'); $file_realname = request('file_realname'); $base_url = base_url(); $file = dirname(__FILE__).'/../../'.str_replace($base_url,'',$file_url); if(!file_exists($file)){ echo "<script>alert('文件不存在')</script>"; return; }else{ header("Content-type:application/octet-stream"); header("Content-Disposition:attachment;filename = ".$file_realname); header("Accept-ranges:bytes"); header("Accept-length:".filesize($file)); readfile($file); }
优势:能够用代码控制文件名的显示,并且能够在下载以前执行一些列操做spa
缺点:一旦文件不存在,就会跳转或刷新页面code
第三种方式(使用ajax代替a标签,ajax访问php控制器,由php设置header后进行下载)ip
具体方法和方式二差很少,就是改为ajax,这里省略...it
优势:由于是ajax,因此即便文件不存在,也不会跳转到其余页面,彻底能够在js中控制io
缺点:目前ajax对中文编码支持不太好,因此若是文件名用的是gbk或gbk2312那就比较麻烦了,最好都是统一的UDF8