您好(hǎo),歡迎來(lái)到(dào)溫江區帝啓網絡工作室官方網站(zhàn)!ZJJCL&$.CN
新聞動态
您現(xiàn)在的(de)位置:首頁 > 技(jì)術(shù)文(wén)摘
PHP 非常實用(yòng)下(xià)載遠(yuǎn)程σ←<✔圖片
來(lái)源:創立工(gōng)作(zuò)室≤≈ 作(zuò)者:馮軍 發布時(shí)間(∏‌♦σjiān):2024-07-23 11:48:02 閱讀(dú) 98×≠←7 次
/**
 * 下(xià)載遠(yuǎn)程圖片
 *<←£ @param string $url 圖片的(de)絕對(duì)ur★↑l
 * @param string $filepath 文(w₹φ™≤én)件(jiàn)的(de)完整路(lù)徑(例如(rú)/www/images/test) ,קγ此函數(shù)會(huì)自(zì)動根據圖片∞₹<url和(hé)http頭信息确定圖片的(de)後綴名
 * @param string $•× filename 要(yào)保存的(de)文(wγ≥≤™én)件(jiàn)名(不(bù)含擴展名)
 * @return mixed 下(xià)載成π←功返回一(yī)個(gè)描述圖片信息的(de)數(Ω↑☆shù)組,下(xià)載失敗則返回false
 Ω$≥*/
static public fun¥Ω>αction downloadImage($url, $filepath, $filename) ∏ק{
    //服務器(qì)返回的(de)頭信息
    $responseHeade₹‍♣rs = array();
    //原始圖片名
    $origin←₩alfilename = '';
  ↓≥  //圖片的(de)後綴名
    $ext = '';
   γ☆÷ $ch = curl_init($url);
    //設置curl_exec返回≥✔☆的(de)值包含Http頭
    curl_se≤✔topt($ch, CURLOPT_HEADER, 1);
     ¥↕£//設置curl_exec返回的(de)值包含Http內(nèi)™≠容
    curl_setopt($ch, CURLOP∞¶ ★T_RETURNTRANSFER, 1);
    //設置抓取跳(¥π€≠tiào)轉(http 301,302)後的(de)頁面
    curl_setopt($c εh, CURLOPT_FOLLOWLOCATION, 1);
    //設置最多(duō)的(<∞¶de)HTTP重定向的(de)數(shù)量ελλ
    curl_setopt($ch, CUR≈‌©LOPT_MAXREDIRS, 3);
 
 ​∑≈   //服務器(qì)返回的(de)數(shù)據(‍♣包括http頭信息和(hé)內(nèi)容)
    $htφα≥ml = curl_exec($ch);¶¶☆₹
    //獲取此次抓取的(de)相(xiàng)關信息
    $httpinf∏$o = curl_getinfo($ch);
   ε£× curl_close($ch);
    if ($html !== fal£>α§se) {
        //分(fēn÷↕≈↔)離(lí)response的(de)header和(hé§σ)body,由于服務器(qì)可(kě)能(néng) λ♠>使用(yòng)了(le)302跳(tiào)轉,所以此處需要(yà☆​✔o)将字符串分(fēn)離(lí)為(wèi) 2+跳(tiào)轉次數(shù) 個(‌♦≠♠gè)子(zǐ)串
        $httpArr = explode("\r\n\≥♥r\n", $html, 2 + $httpinfo['redirect_count']₹♠¶α);
        //倒數(shù)第二段是(shì)服務器(β≈ qì)最後一(yī)次response的(de)http頭
  <ε≥      $header = $httpArr[count($httpA↓£πrr) - 2];
        //倒數​ γ(shù)第一(yī)段是(shì)服務器(qì&β≈π)最後一(yī)次response的(de)內(nèi)容
       ±γΩφ $body = $httpArr[count($httpArr) - 1];
  <§       $header.="\r\n";
 
        //獲取最後一₹≠‍(yī)次response的(de)header信息¥$→¶
        preg_match_all(∞®↕±'/([a-z0-9-_]+):\s*([^\r\n]+)\r\n/i'₽♦&×, $header, $matches);
        if (!empty($m∏<↕atches) && count($matches) == 3 &a$¥↓☆mp;& !empty($matches[1]) && Ω ✘!empty($matches[1])) {
          ₹•  for ($i = 0; $i < co↓δ unt($matches[1]); $i++) {
               €π if (array_key_exists($i, $ δ ∑matches[2])) {
                    $respons ​←∑eHeaders[$matches[1][$i]] = $≥δΩ≠matches[2][$i];
                }
        ↓‌    }
        }
        //獲取σ​¥圖片後綴名
        if (0 < preg_match('{(?:[^\/\\\φ♠∏₩\]+)\.(jpg|jpeg|gif|png|bmp)$}i', $★βurl, $matches)) {
            $originalfilename‌±  = $matches[0];
           ε→✘↓ $ext = $matches[1];
 €​¥¶       } else {
       ₩∏☆♠     if (array_key_exists(Ω£€<'Content-Type', $responsβ↑>☆eHeaders)) {
      δ÷&          if (0 < preg_match('{im £αΩage/(\w+)}i', $responseHeaders['Content-Type'↕  ], $extmatches)) {
          ≤™          $ext = $ex'∏€tmatches[1];
                }
            }
γ×'
        }
        //保存文(wén)件(jiàn)
        i♠₽ f (!empty($ext)) {
            //如(rú)果目錄不(↕♠φbù)存在,則先要(yào)創建目錄
            if(!is_dir∑≤♥&($filepath)){
                mkdir($filepatλ★±h, 0777, true);
            }
     ★★            
            $filepath•™' .= '/'.$filename.".$eδ‌xt";
            $local_file = fopen($fil★©÷epath, 'w');
            if (fa↔ ↔₩lse !== $local_file) {
     ∞←€'           if (false !== fwrite($local_file,≥↓£₹ $body)) {
         α£            fclose($local_file);
   δ↑♠‍                 $sizeinfo = getimagesize(®δ•$filepath);
                 δ₹   return array('filepath' => ∏∑★realpath($filepath), 'width' => $s& § izeinfo[0], 'height' => $sizeinfo[1]♦✔∏, 'orginalfilename' => $originalfilenam↑™e, 'filename' => pathinfo($ε£↔λfilepath, PATHINFO_BASENAME));
                }€↓
            }
        }
    }
  ✘♥♠  return false;
}