首先,将FileToZip.class文件放到ThinkPHP/Extend/Library/ORG/Util/文件夹中,FileToZip.class.php为zip下载类,其详细代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
<?php /** * zip下载类文件 * 遍历目录,打包成zip格式 */ class traverseDir{ public $currentdir ; //当前目录 public $filename ; //文件名 public $fileinfo ; //用于保存当前目录下的所有文件名和目录名以及文件大小 public $savepath ; public function __construct( $curpath , $savepath ){ $this ->currentdir= $curpath ; //返回当前目录 $this ->savepath= $savepath ; //返回当前目录 } //遍历目录 public function scandir( $filepath ){ if ( is_dir ( $filepath )){ $arr =scandir( $filepath ); foreach ( $arr as $k => $v ){ $this ->fileinfo[ $v ][]= $this ->getfilesize( $v ); } } else { echo "<script>alert('当前目录不是有效目录');</script>" ; } } /** * 返回文件的大小 * * @param string $filename 文件名 * @return 文件大小(KB) */ public function getfilesize( $fname ){ return filesize ( $fname )/1024; } /** * 压缩文件(zip格式) */ public function tozip( $items ){ $zip = new ZipArchive(); $zipname = date ( 'YmdHis' ,time()); if (! file_exists ( $zipname )){ $zip ->open( $savepath . $zipname . '.zip' ,ZipArchive::OVERWRITE); //创建一个空的zip文件 for ( $i =0; $i < count ( $items ); $i ++){ $zip ->addFile( $this ->currentdir. '/' . $items [ $i ], $items [ $i ]); } $zip ->close(); $dw = new download( $zipname . '.zip' , $savepath ); //下载文件 $dw ->getfiles(); unlink( $savepath . $zipname . '.zip' ); //下载完成后要进行删除 } } } /** * 下载文件 * */ class download{ protected $_filename ; protected $_filepath ; protected $_filesize ; //文件大小 protected $savepath ; //文件大小 public function __construct( $filename , $savepath ){ $this ->_filename= $filename ; $this ->_filepath= $savepath . $filename ; } //获取文件名 public function getfilename(){ return $this ->_filename; } //获取文件路径(包含文件名) public function getfilepath(){ return $this ->_filepath; } //获取文件大小 public function getfilesize(){ return $this ->_filesize=number_format( filesize ( $this ->_filepath)/(1024*1024),2); //去小数点后两位 } //下载文件的功能 public function getfiles(){ //检查文件是否存在 if ( file_exists ( $this ->_filepath)){ //打开文件 $file = fopen ( $this ->_filepath, "r" ); //返回的文件类型 Header( "Content-type: application/octet-stream" ); //按照字节大小返回 Header( "Accept-Ranges: bytes" ); //返回文件的大小 Header( "Accept-Length: " . filesize ( $this ->_filepath)); //这里对客户端的弹出对话框,对应的文件名 Header( "Content-Disposition: attachment; filename=" . $this ->_filename); //修改之前,一次性将数据传输给客户端 echo fread ( $file , filesize ( $this ->_filepath)); //修改之后,一次只传输1024个字节的数据给客户端 //向客户端回送数据 $buffer =1024; // //判断文件是否读完 while (! feof ( $file )) { //将文件读入内存 $file_data = fread ( $file , $buffer ); //每次向客户端回送1024个字节的数据 echo $file_data ; } fclose( $file ); } else { echo "<script>alert('对不起,您要下载的文件不存在');</script>" ; } } } |
ThinkPHP中加载zip下载类FileToZip.class.php并实现本地文件打包下载的功能代码如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import( 'ORG.Util.FileToZip' ); //引入zip下载类文件FileToZip // 打包下载 $handler = opendir( $cur_file ); //$cur_file 文件所在目录 $download_file = array (); $i = 0; while ( ( $filename = readdir( $handler )) !== false ) { if ( $filename != '.' && $filename != '..' ) { $download_file [ $i ++] = $filename ; } } closedir ( $handler ); $scandir = new traverseDir( $cur_file , $save_path ); //$save_path zip包文件目录 $scandir ->tozip( $download_file ); |