php 下載圖片並打包成Zip格式壓縮包


前言:最近公司有個需要下載多個圖片並打包成壓縮包的需求,下面來看看具體是怎么做的

 

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地址欄的方式訪問就能下載了

具體原因如下:

 

 

以上就是本篇文章的全部內容了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM