field("*")->select()->toArray(); //$list = Article::where('status', 3)->field("*")->select()->toArray(); if(empty($list)){ echo 'none';die; } //创建待处理目录 $fileName = date('Y-m-d_H:i:s'); $pathSrc = getcwd() . '/uploads/' . $fileName; $zipFile = $pathSrc . '.zip'; mkdir($pathSrc, 0777, true); foreach ($list as $value) { if(empty($value['account']))continue; $uuid = strtoupper(md5($value['id'])); //创建文件夹 $artSrc = $pathSrc . '/' . $uuid; if (!is_dir($artSrc)) { //若目录不存在则创建之 mkdir($artSrc, 0777, true); } //url图片保存本地 if(empty($value['cover'])){ copy(getcwd() . '/static/empty.png', $artSrc . '/b_cover.jpg'); }else{ $this->down_img($artSrc, $value['cover']); } //文章内容 $wordname = $artSrc . "/a_article.doc"; //html标签类文章转成word $html = $value['content']; $this->start(); echo $html; $this->save($wordname); //设置信息 file_put_contents($artSrc . '/c_message.txt', $value['id'] . "\r\n" .$value['title']); //设置账号 file_put_contents($artSrc . '/d_account.txt', $this->getAccounts($value['account'])); //更改状态为已下载 Article::where('id', $value['id'])->update([ 'status' => 3, 'download_time' => date('Y-m-d H:i:s') ]); } //打包 $this->zip($pathSrc, $zipFile); //下载 $this->downloadZip($zipFile); die; } function start() { ob_start(); echo ''; } function save($path) { echo ""; $data = ob_get_contents(); ob_end_clean(); $this->wirtefile($path, $data); } function wirtefile($fn, $data) { $fp = fopen($fn, "wb"); fwrite($fp, $data); fclose($fp); } function down_img($path,$img_url){ ob_start(); readfile($img_url); $img=ob_get_contents(); ob_end_clean(); $filename = '/b_cover.jpg'; $fp2=@fopen($path . $filename,'a'); fwrite($fp2,$img); fclose($fp2); unset($img,$url); } private function getAccounts($accountIdStr){ $content = []; $accountIds = explode(',', $accountIdStr); $accounts = Expert::where('id', 'in', $accountIds)->field("*")->select()->toArray(); foreach($accounts as $item){ $content[] = $item['platform_code'] . '|' . $item['script_x'] . '|' . $item['script_y']; } return implode("\r\n", $content); } //下载function private function downloadZip($zipPath) { $zipPath = iconv("UTF-8", "GBK", $zipPath);//加这行中文文件夹也ok了 header("Cache-Control: public"); header("Content-Description: File Transfer"); header('Content-disposition: attachment; filename=' . basename($zipPath)); //文件名 header("Content-Type: application/zip"); //zip格式的 header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件 header('Content-Length: ' . filesize($zipPath)); //告诉浏览器,文件大小 @readfile($zipPath);//ob_end_clean(); @unlink(app()->getRootPath().'public/'.$zipPath);//删除压缩包 } /** * zip压缩 * @param string $zipfile 压缩文件目录 * @param string $unzipdir 解压目录 */ public function zip($dirsrc, $zipfile){ if(!is_dir($dirsrc)){ return false; } $aimDir = dirname($zipfile); $this->createDir($aimDir); $zip = new \ZipArchive; $res = $zip->open($zipfile, \ZipArchive::CREATE); if($res !== true){ return false; } $this->_zip($dirsrc, $zip); $zip->close(); //关闭处理的zip文件 return true; } //递归将文件添加至压缩包 private function _zip($path, $zip, $zip_path = ''){ $path = rtrim($path, '/'); $handler = opendir($path); //打开当前文件夹由$path指定。 while(($filename = readdir($handler)) !== false){ if($filename == '.' || $filename == '..')continue; $nowPath = $path . '/' . $filename; $thzip_path = $zip_path . $filename; if(is_dir($nowPath)){ // 如果读取的某个对象是文件夹,则递归 $this->_zip($nowPath, $zip, $thzip_path . '/'); }else{ //将文件加入zip对象 $zip->addFile($nowPath, $thzip_path); } } @closedir($path); } /** * 递归创建文件夹 * @param string $path 路径 */ public function createDir($path){ if (!file_exists($path)){ $this->createDir(dirname($path)); mkdir($path, 0777); } } }