PHP实现文件压缩、文件解压缩及文件下载代码片段记录。
- /**
- * 文件打包下载
- * @param string $downloadZip 打包后下载的文件名
- * @param array $list 打包文件组
- * @return void
- */
- function addZip($downloadZip,$list){
- // 初始化Zip并打开
- $zip = new \ZipArchive();
- // 初始化
- $bool = $zip->open($downloadZip, \ZipArchive::CREATE|\ZipArchive::OVERWRITE);
- if($bool === TRUE) {
- foreach ($list as $key => $val) {
- // 把文件追加到Zip包并重命名
- // $zip->addFile($val[0]);
- // $zip->renameName($val[0], $val[1]);
- // 把文件追加到Zip包
- $zip->addFile($val, basename($val));
- }
- }else{
- exit('ZipArchive打开失败,错误代码:' . $bool);
- }
- // 关闭Zip对象
- $zip->close();
- // 下载Zip包
- header('Cache-Control: max-age=0');
- header('Content-Description: File Transfer');
- header('Content-disposition: attachment; filename=' . basename($downloadZip));
- header('Content-Type: application/zip'); // zip格式的
- header('Content-Transfer-Encoding: binary'); // 二进制文件
- header('Content-Length: ' . filesize($downloadZip)); // 文件大小
- readfile($downloadZip);
- exit();
- }
- /**
- * 解压压缩包
- * @param string $zipName 要解压的压缩包
- * @param string $dest 解压到指定目录
- * @return boolean
- */
- function unZip($zipName,$dest){
- //检测要解压压缩包是否存在
- if(!is_file($zipName)) {
- return false;
- }
- //检测目标路径是否存在
- if(!is_dir($dest)) {
- mkdir($dest, 0777, true);
- }
- // 初始化Zip并打开
- $zip = new \ZipArchive();
- // 打开并解压
- if($zip->open($zipName)) {
- $zip->extractTo($dest);
- $zip->close();
- return true;
- }else{
- return false;
- }
- }
- /**
- * 文件下载
- * @param string $filename 要下载的文件
- * @param string $refilename 下载后的命名
- * @return void
- */
- function download($filename,$refilename = null){
- // 验证文件
- if(!is_file($filename)||!is_readable($filename)) {
- return false;
- }
- // 获取文件大小
- $fileSize = filesize($filename);
- // 重命名
- !isset($refilename) && $refilename = $filename;
- // 字节流
- header('Content-Type:application/octet-stream');
- header('Accept-Ranges: bytes');
- header('Accept-Length: ' . $fileSize);
- header('Content-Disposition: attachment;filename='.basename($refilename));
- // 校验是否限速(超过1M自动限速,同时下载速度设为1M)
- $limit = 1 * 1024 * 1024;
- if( $fileSize <= $limit ) {
- readfile($filename);
- }else{
- // 读取文件资源
- $file = fopen($filename, 'rb');
- // 强制结束缓冲并输出
- ob_end_clean();
- ob_implicit_flush();
- header('X-Accel-Buffering: no');
- // 读取位置标
- $count = 0;
- // 下载
- while (!feof($file) && $fileSize - $count > 0){
- $res = fread($file, $limit);
- $count += $limit;
- echo $res;
- sleep(1);
- }
- fclose($file);
- }
- exit();
- }