php下載圖片到本地


寫了一天,就寫了這么點代碼,湊合用吧。

#saveImage.php
<?php /** * 圖片下載方法,提供兩種圖片保存方式: * 1.按照圖片自帶的名稱保存 * 2.按照自定義文件名保存 * 其中使用自帶的文件名的方式中有兩種獲取文件名的方式: * 1.如果圖片URL中包含文件名,則直接使用圖片中的文件名 * 2.否則,如果圖片的響應頭信息中包含文件名信息,使用該文件名 * 獲取文件擴展名有兩種方式: * 1.如果圖片的響應頭信息中包含圖片類型信息,直接使用類型信息作為擴展名 * 如:Content-Type: image/jpeg,這時候會使用jpeg作為文件擴展名 * 2.如果文件URL地址中包含擴展名,則使用URL中的擴展名 * * 使用的時候直接調用saveImage() * * 以下是一個例子,涉及三個參數: * $url 圖片地址 * $path 圖片存儲路徑 * $file_name 圖片名稱 * * 如果不需要指定文件名則可以只傳前兩個參數: * saveImage($url, $path); * 如果需要指定文件名則需要三個參數同時傳: * saveImage($url, $path, $file_name); * @author lrx2005123@sina.com */ /** * 獲取圖片名稱 * @param string $url 圖片的地址 * @param string $header 圖片的響應頭信息 * @return string 返回文件名或空 */ function getImgName($url, $header) { $image_name = ''; /* 從URL中獲取文件名 */ $tmp_name = getNameFromURL($url); /* URL中不包含文件名 */ if (empty ($tmp_name)) { $tmp_name = getNameFromHeader ($header); } /* 文件名不為空 */ if (!empty ($tmp_name)) { /* 但是文件名中不包含擴展名 */ if(!strpos ($tmp_name, '.')) { $tmp_ext = getExt ($url, $header); /* 從頭信息中獲取的文件擴展名不為空 */ if (!empty ($tmp_ext)) { $image_name = sprintf("%s.%s", $tmp_name, $tmp_ext); } } /* 文件名中包含擴站名 */ else { $image_name = $tmp_name; } } /* 頭信息中沒有文件名 */ else { $image_name = ''; } return $image_name; } /** * 獲取圖片的擴展名,先通過分析響應頭信息中的Content-type的信息來確定 * 然后通過分析圖片的地址URL來獲取擴展名 * @param string $url 圖片的地址 * @param string $header 圖片的響應頭信息 * @return string 返回擴展名或空 */ function getExt($url, $header) { $file_ext = ''; $file_ext = getExtFromHeader ($header); if (empty ($file_ext)) { $file_ext = getExtFromURL ($url); } return $file_ext; } /** * 通過分析圖片的地址URL來獲取擴展名 * @param string $url 圖片的地址 * @return string 返回擴展名或空 */ function getExtFromURL($url) { $name = getNameFromURL ($url); $ext = ''; if (!empty ($name) && strpos ($name, '.') !== false) { $ext = substr ($name, strrpos ($name, '.')); } return $ext; } /** * 通過圖片地址URL獲取圖片名稱 * @param string $url 圖片地址 * @return string 返回文件名或空 */ function getNameFromURL($url) { $name = ''; /* URL中包含文件名 */ if (preg_match ('/\/([^\/]+\.[a-z]{3,4})(\?.*?)?$/i',$url, $matches)) { $name = $matches[1] ? trim ($matches[1]) : ''; } return $name; } /** * 通過分析響應頭信息中的Content-type的信息獲取擴展名 * @param string $header 圖片的響應頭信息 * @return string 返回擴展名或空 */ function getExtFromHeader($header) { $file_ext = ''; if (preg_match ('/Content-Type: image\/(.*?)\n/', $header, $matches)) { $file_ext = $matches[1] ? trim ($matches[1]) : ''; } return $file_ext; } /** * 通過分析圖片響應頭信息獲取圖片名稱 * @param string $header 圖片的響應頭信息 * @return string 返回文件名或空 */ function getNameFromHeader($header) { $file_name = ''; if (preg_match('/Content-Disposition:.*?filename="([^"]+)".*?\n/', $header, $matches)) { $file_name = $matches[1] ? trim($matches[1]) : ''; } return $file_name; } /** * 入口方法,通過圖片URL地址獲取圖片信息並下載圖片到本地 * @param string $url 圖片地址 * @param string $path 圖片下載路徑 * @param string $file_name 圖片自定義名稱 default '' * @return bool */ function saveImage($url, $path, $file_name = '') { $handle = curl_init ($url); /* 顯示響應頭信息 */ curl_setopt ($handle, CURLOPT_HEADER, true); curl_setopt ($handle, CURLOPT_RETURNTRANSFER, 1); $img = curl_exec ($handle); $file_size = curl_getinfo ($handle, CURLINFO_SIZE_DOWNLOAD); $http_code = curl_getinfo ($handle, CURLINFO_HTTP_CODE); curl_close ($handle); list ($header, $body) = explode ("\r\n\r\n", $img, 2); wlog ("http code: $http_code"); if ($http_code == 301 || $http_code == 302) { wlog ("[$url]重定向..."); $matches = array(); if (!preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches)) { wlog ('解析頭信息失敗,結束。'); return false; } $redirect_url = trim (array_pop ($matches)); $url_parsed = parse_url ($redirect_url); if (isset ($url_parsed)) { wlog ("已獲取重定向地址[$redirect_url],\n正在跳轉..."); return saveImage ($redirect_url, $path, $file_name); } else { wlog ('獲取重定向地址失敗,結束。'); return false; } } elseif ($http_code == 200) { wlog ('請求成功...'); } else { wlog ('無效的請求,結束。'); return false; } if (!empty ($file_name)) { $file_ext = getExt ($url, $header); if (empty ($file_ext)) { wlog ('無效的圖片地址!'); return false; } $image_name = sprintf ("%s.%s", $file_name, trim($file_ext)); } else { $image_name = getImgName ($url, $header); if (empty($image_name)) { wlog ('無效的圖片地址!'); return false; } } if (!file_exists ($path)) { wlog ("目錄$path不存在,正在創建..."); if (mkdir ($path)) { wlog ('目錄創建成功...'); } else { wlog ('目錄創建失敗,結束。'); return false; } } $file_path = rtrim ($path, '/') . '/' . $image_name; $fp = fopen ($file_path, 'w'); $length = fwrite ($fp, $body); fclose ($fp); if ($length) { wlog ("文件保存成功!\n大小: $length\n位置: $file_path"); } else { wlog ('文件保存失敗。'); return false; } return true; } /** * 記錄日志方法 * @param string $msg * @param string $path default '' */ function wlog ($msg, $path = '') { if (empty ($path)) { $path = 'log/save_img.log'; } if (!file_exists (dirname ($path))) { if (!mkdir (dirname ($path))) { die('can not create directory' . dirname ($path)); } } $fp = @fopen ($path, 'a'); flock ($fp, LOCK_EX); fwrite ($fp, $msg . "\n"); flock ($fp, LOCK_UN); fclose ($fp); }

 

調用的時候直接用saveImage($url, $path)就可以了。

寫了個測試的腳本,把常用的圖片格式都試了一遍,都可以通過

#test.php
<?php
define('PATH', 'download/');
//require('class_inc/downloadImg.php');
require('class_inc/saveImage.php');
$img_list = ['png' => 'http://www.freepngimg.com/download/facebook/1-2-facebook-download-png.png',
             'gif' => 'https://kanimg.9ku.com/Article/20170725/1500953725469381.gif',
             'jpg & redirect' => 'http://pic2116.ytqmx.com:82/2017/0725/37/4.jpg',
             'jpeg' => 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/52/Soviet_BMP-1_IFV.JPEG/300px-Soviet_BMP-1_IFV.JPEG',
             'gif' => 'http://n.sinaimg.cn/sports/transform/20170906/W34l-fykpyua5747968.gif',
             'jpg with params' => 'http://img.freepik.com/free-icon/bmp-image-file-type-outlined-interface-symbol_318-72075.jpg?size=338&ext=jpg',
             'webp' => 'http://www.gstatic.com/webp/gallery/1.webp',
             'bmp' => 'http://samples.fileformat.info/format/bmp/sample/4cb74cda027a43f3b278c05c3770950f/MARBLES.BMP?AWSAccessKeyId=0V91BEFA7GM093MEVMG2&Signature=t18N8JiZUw0QOd%2FZcyK8oZAwUWk%3D&Expires=1505213123',
             'bmp1' => 'http://cfile8.uf.tistory.com/image/167475304C879B427393BA'
            ];


foreach ($img_list as $type => $url)
{
    echo "download image $type:";

    $file_name = md5($url);
    if (saveImage($url, PATH, $file_name))
    {
        echo "done\n";
    }
    else
    {
        echo "failed\n";
    }

}

 


免責聲明!

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



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