最近做的項目是一個圖片的項目,剛開始偷懶上傳到的是本機服務器上的路徑地址,然後上傳到線上一段時間之後,人多服務器帶不起來了,就趕緊將圖片地址由本機地址,上傳到阿里雲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的還不會用,勤學勤練,明天將數據庫的導入導出搞定。