本文实例讲述了PHP实现打包下载文件的方法。分享给大家供大家参考,具体如下:
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
110
111
|
/**
* 下载文件
* @param $img
* @return string
*/
public function Download( $img )
{
$items = [];
$names = [];
if ( $img )
{
//用于前端跳转zip链接拼接
$path_redirect = '/zip/' . date ( 'Ymd' );
//临时文件存储地址
$path = '/tmp' . $path_redirect ;
if (! is_dir ( $path ))
{
mkdir ( $path , 0777,true);
}
foreach ( $img as $key => $value ) {
$fileContent = '' ;
$fileContent = $this ->CurlDownload( $value [ 'url' ]);
if ( $fileContent )
{
$__tmp = $this ->SaveFile( $value [ 'url' ] , $path , $fileContent );
$items [] = $__tmp [0];
$names [] = $value [ 'name' ]. '_' .( $key +1). '.' . $__tmp [1];
}
}
if ( $items )
{
$zip = new ZipArchive();
$filename = time(). 'download.zip' ;
$zipname = $path . '/' . $filename ;
if (! file_exists ( $zipname )) {
$res = $zip ->open( $zipname , ZipArchive::CREATE | ZipArchive::OVERWRITE);
if ( $res ) {
foreach ( $items as $k => $v ) {
$value = explode ( "/" , $v );
$end = end ( $value );
$zip ->addFile( $v , $end );
$zip ->renameName( $end , $names [ $k ]);
}
$zip ->close();
} else {
return '' ;
}
//通过前端js跳转zip地址下载,让不使用php代码下载zip文件
//if (file_exists($zipname)) {
//拼接附件地址
//$redirect = 域名.$path_redirect.'/'.$filename;
//return $redirect;
//header("Location:".$redirect);
//}
//直接写文件的方式下载到客户端
if ( file_exists ( $zipname )) {
header( "Cache-Control: public" );
header( "Content-Description: File Transfer" );
header( 'Content-disposition: attachment; filename=附件.zip' ); //文件名
header( "Content-Type: application/zip" ); //zip格式的
header( "Content-Transfer-Encoding: binary" ); //告诉浏览器,这是二进制文件
header( 'Content-Length: ' . filesize ( $zipname )); //告诉浏览器,文件大小
@readfile( $zipname );
}
//删除临时文件
@unlink( $zipname );
}
}
return '' ;
}
}
/**
* curl获取链接内容
* @param $url
* @return mixed|string
*/
public function CurlDownload( $url ) {
$ch = curl_init( $url );
curl_setopt( $ch , CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1);
curl_setopt( $ch , CURLOPT_HEADER, 0);
curl_setopt( $ch , CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt( $ch , CURLOPT_SSL_VERIFYPEER, false);
curl_setopt( $ch , CURLOPT_SSL_VERIFYHOST, false);
$errno = curl_errno( $ch );
$error = curl_error( $ch );
$res =curl_exec( $ch );
curl_close( $ch );
if ( $errno >0){
return '' ;
}
return $res ;
}
/**
* 保存临时文件
* @param $url
* @param $dir
* @param $content
* @return array
*/
public function SaveFile( $url , $dir , $content )
{
$fname = basename ( $url ); //返回路径中的文件名部分
$str_name = pathinfo ( $fname ); //以数组的形式返回文件路径的信息
$extname = strtolower ( $str_name [ 'extension' ]); //把扩展名转换成小写
$path = $dir . '/' .md5( $url ). $extname ;
$fp = fopen ( $path , 'w+' );
fwrite( $fp , $content );
fclose( $fp );
return array ( $path , $extname ) ;
}
|
引用:
1
2
|
$img = [[ 'url' => '地址url/1.jpg' , 'name' => '名字' ]];
Download( $img );
|
希望本文所述对大家PHP程序设计有所帮助。
原文链接:http://blog.csdn.net/alen_xiaoxin/article/details/72844469