適用場景:
1.下載未知文件
$img1 = "http://mmbiz.qpic.cn/mmbiz_jpg/Kw4kiadJ8mXwhmwuTw0bL4pk0BEfSLAIeeCibACXwQ2HkCibRAAxsL8CfW3aJRrqzFwE5vibz3hficbM8ZUE5Nmq4Cw/0";
$img2 = "http://wx.qlogo.cn/mmopen/ajNVdqHZLLDJCbZ1ujKLbWzUI3VicJ4GlKP6Ds9CziapRF93VRKb9CVvZRBHtIbnuHlDVn0A2Ufx67thE30QlCBA/0“;
如上都是圖片turl,在瀏覽器打開,可以看到是圖片,但是從URL中看不出來,上面來自微信的頭像,如果想把圖片拉取到自己的服務器,可以使用下面的方法。
/**
* 遠程下載圖片文件
* @param string $url [遠程圖片的URL]
* @param string $path [要保存的路徑]
* @return string [返回保存后得到文件路徑]
*/
function downloadImageFromUrl($url, $path = "./download/images/") {
// 因為不知道最后接受到的文件是什么格式,先建立一個臨時文件,用於保存
$tmpFile = tempnam(sys_get_temp_dir(), 'image');
# 文件下載 BEGIN #
// 打開臨時文件,用於寫入(w),b二進制文件
$resource = fopen($tmpFile, 'wb');
// 初始化curl
$curl = curl_init($url);
// 設置輸出文件為剛打開的
curl_setopt($curl, CURLOPT_FILE, $resource);
// 不需要頭文件
curl_setopt($curl, CURLOPT_HEADER, 0);
// 執行
curl_exec($curl);
// 關閉curl
curl_close($curl);
// 關閉文件
fclose($resource);
# 文件下載 END #
// 獲取文件類型
if (function_exists('exif_imagetype')) {
// 讀取一個圖像的第一個字節並檢查其簽名(這里需要打開mbstring及php_exif)
$fileType = exif_imagetype($tmpFile);
} else {
// 獲取文件大小,里面第二個參數是文件類型 (這里后綴可以直接通過getimagesize($url)來獲取,但是很慢)
$fileInfo = getimagesize($tmpFile);
$fileType = $fileInfo[2];
}
// 根據文件類型獲取后綴名
$extension = image_type_to_extension($fileType);
// 計算指定文件的 MD5 散列值,作為保存的文件名,重復下載同一個文件不會產生重復保存,相同的文件散列值相同
$md5FileName = md5_file($tmpFile);
// 最終保存的文件
$returnFile = $path . $md5FileName . $extension;
// 檢查傳過來的路徑是否存在,不存在就創建
if (!is_dir($path)) {
mkdir($path, 0777, true);
}
// 復制臨時文件到最終保存的文件中
copy($tmpFile, $returnFile);
// 釋放臨時文件
@unlink($tmpFile);
// 返回保存的文件路徑
return $returnFile;
}
上面的函數只適用於下載圖片文件,對其他類型可以通過改動實現。
該方式下載很快。
