前言:最近公司有個需要下載多個圖片並打包成壓縮包的需求,下面來看看具體是怎么做的
1、沒什么說的,懶得說啥,直接看代碼
/** * 下載圖片並生成壓縮包 * @param $data 圖片數組,一維 * @param $tmpDir 存放路徑 * @return string */ public function downloadZipImg() { $picAllArr = ['http://www.dada.com/a.jpg','http://www.dada.com/b.jpg']; $tmpDir = '這里是圖片下載路徑目錄'; // 類似於/www/public/upload/ if (!file_exists($tmpDir)) { //創建文件夾 mkdir($tmpDir, 0777, true); } $zipName = date('His') . mt_rand(1000, 9999) . '.zip'; // 壓縮包文件名 $zipNameUrl = $tmpDir . $zipName; // 文件路徑 // 生成文件 $zip = new \ZipArchive(); if ($zip->open($zipNameUrl, \ZipArchive::OVERWRITE) !== true) { //OVERWRITE 參數會覆寫壓縮包的文件 文件必須已經存在 if ($zip->open($zipNameUrl, \ZipArchive::CREATE) !== true) { // 文件不存在則生成一個新的文件 用CREATE打開文件會追加內容至zip return '下載失敗,文件夾不存在'; } } foreach ($picAllArr as $file) { //判斷圖片是否存在 $isFile = $this->checkFileExists($file); if (!$isFile) { continue; } //抓取圖片內容 $fileContent = file_get_contents($file); //添加圖片 $zip->addFromString(basename($file), $fileContent); } // 關閉 $zip->close(); //沒有文件 if (!file_exists($zipNameUrl)) { return '下載失敗,圖片不存在或無法下載'; } header("Cache-Control: public"); header("Content-Description: File Transfer"); header('Content-disposition: attachment; filename=' . $zipName); //文件名 header("Content-Type: application/zip"); //zip格式的 header("Content-Transfer-Encoding: binary"); //告訴瀏覽器,這是二進制文件 header('Content-Length: ' . filesize($zipNameUrl)); //告訴瀏覽器,文件大小 // 下面2步必須要 ob_clean(); flush(); @readfile($zipNameUrl); unlink($zipNameUrl); // 刪除文件 exit; }
/** * 判斷文件是否存在,支持本地及遠程文件 * @param String $file 文件路徑 * @return Boolean */ private function checkFileExists($file) { // 遠程文件 if (strtolower(substr($file, 0, 5)) == 'https') { // 遠程文件 $header = get_headers($file, true); return isset($header[0]) && (strpos($header[0], '200') || strpos($header[0], '304')); } elseif (strtolower(substr($file, 0, 4)) == 'http') { // 遠程文件 $header = get_headers($file, true); return isset($header[0]) && (strpos($header[0], '200') || strpos($header[0], '304')); } else { // 本地文件 return file_exists($file); } }
上面代碼注釋已經很清晰了,已經不需要在特殊說明了,這是親測有效的代碼,不然也不會拿出來,訪問的時候,別用ajax來請求,因為瀏覽器不讓ajax操作流文件,只能讀,所以通過href地址欄的方式訪問就能下載了。
具體原因如下:
以上就是本篇文章的全部內容了