圖片打包下載,本地服務器打包文件下載,及線上圖片地址下載

最近做的項目是一個圖片的項目,剛開始偷懶上傳到的是本機服務器上的路徑地址,然後上傳到線上一段時間之後,人多服務器帶不起來了,就趕緊將圖片地址由本機地址,上傳到阿里雲oss上,然後現在就開始遇見難題了,首先要判斷地址是否是https請求的,如果是https請求的則替換方法,目前先將,本地服務器打包下載文件,和線上圖片地址下載,訪問打包下載放上,然後在整合代碼。

本地服務器下載圖片,打包下載

# 本機服務器打包下載  好的代碼,現在欠缺的是 循環得出所有的圖片地址
    public function downzip()
    {
		# 本機的圖片地址
        $fileList = array(
            ROOT_PATH.'public/uploads/images/20200430/6ae71761fe4679d4f667159550fec794.jpg',
            ROOT_PATH.'public/uploads/images/20200506/1fc409f456bd4d048d4de19b46e9f203.jpg',
            ROOT_PATH.'public/uploads/images/20200506/fa1775a7e7cf8b4ecc69fea1069577ce.jpg'
        );

        $zip = new \ZipArchive; // 實例化zip對象
        $zip_time = time().".zip"; // 壓縮的目錄名
        $zip_filename = ROOT_PATH."public/uploads".$zip_time; // 指定一個壓縮包地址,你當前項目的文件地址。
        $zip->open($zip_filename,\ZipArchive::CREATE);   //打開壓縮包 如果沒有則 創建

        # 對這個圖片地址進行循環遍歷,
        foreach($fileList as $file){

            # 循環遍歷下載文件。
            $zip->addFile($file,basename($file));   //向壓縮包中添加文件
        }
        $zip->close();  //關閉壓縮包

        # 下載 文件
        header("Content-type:text/html;charset=utf-8");

        $file_name = iconv("utf-8","gb2312",$zip_time);

        # 將反斜槓 替換成正斜槓
        $file_path = str_replace('\\','/',$zip_filename);

        if(!file_exists($file_path)){
            echo "下載文件不存在!";exit;         //如果提示這個錯誤,很可能你的路徑不對,可以打印$file_sub_path查看
        }

        $fp=fopen($file_path,"r");
        $file_size=filesize($file_path);

        //下載文件需要用到的頭
        Header("Content-type: application/octet-stream");
        Header("Accept-Ranges: bytes");
        Header("Accept-Length:".$file_size);
        Header("Content-Disposition: attachment; filename = ". $file_name);
        $buffer=1024;
        $file_count=0;
        while(!feof($fp) && $file_count<$file_size){
            $file_con=fread($fp,$buffer);
            $file_count+=$buffer;
            echo $file_con;
        }
        fclose($fp);    //關閉這個打開的文件
        // unlink($zip_filename) // 開啓之後,會自動將本機服務器上的zip包刪除,首先可以降低資源,不好的是沒有備份
    }

線上圖片地址整合

# 線上地址 打包下載
    public function demo()
    {
        $files = [
            'https://dss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3252521864,872614242&fm=26&gp=0.jpg',
            'https://dss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=4018557288,1217151095&fm=26&gp=0.jpg'
        ];

        $zip = new \ZipArchive;
        $zip_time = time().".zip"; // 可隨機生成壓縮的目錄名
        $zip_filename = ROOT_PATH."public/uploads".$zip_time; // 指定一個壓縮包地址
        $zip->open($zip_filename,\ZipArchive::CREATE);   //打開壓縮包如果沒有回自動創建

        foreach ($files as $file) {
            # 模擬curl訪問發送請求
            $ch = curl_init(); # 初始化curl
            curl_setopt($ch, CURLOPT_POST, 0);
            curl_setopt($ch,CURLOPT_URL,$file);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 訪問的是 ssl地址,不設置會報錯
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $fileContent = curl_exec($ch); // 發送這個請求
            curl_close($ch);// 關閉curl;
            $zip->addFromString(basename($file), $fileContent);
        }
        $res = $zip->close();

        dump($res);//  如果爲true則代表圖片打包成功
        
        # 注意這個沒有打包下載,如需打包下載,可參考上塊代碼,粘貼複製,找好路徑即可。
    }

線上訪問這個偷了懶,模擬curl請求,然後這個的速度會很慢,尤其是圖片多了之後,這是因爲沒打包一次即代表發送了一次請求,所以這個的速度會很慢,還需要優化,新需求,因爲本身我是要去oss上去下載圖片,所以老闆是說了可以不要直接打包下載,將oss上面的圖片複製一份放到一個目錄就行,下載的話讓用戶自己去下載就好了,再重新搞,正好oss的還不會用,勤學勤練,明天將數據庫的導入導出搞定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章