PHP經過curl遠程獲取圖像並保存到本地

適用場景:php

1.下載未知文件瀏覽器

$img1 = "http://mmbiz.qpic.cn/mmbiz_jpg/Kw4kiadJ8mXwhmwuTw0bL4pk0BEfSLAIeeCibACXwQ2HkCibRAAxsL8CfW3aJRrqzFwE5vibz3hficbM8ZUE5Nmq4Cw/0";服務器

$img2 = "http://wx.qlogo.cn/mmopen/ajNVdqHZLLDJCbZ1ujKLbWzUI3VicJ4GlKP6Ds9CziapRF93VRKb9CVvZRBHtIbnuHlDVn0A2Ufx67thE30QlCBA/0「;微信

如上都是圖片turl,在瀏覽器打開,能夠看到是圖片,可是從URL中看不出來,上面來自微信的頭像,若是想把圖片拉取到本身的服務器,能夠使用下面的方法。curl

 

/**
* 遠程下載圖片文件
* @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;
}

 

上面的函數只適用於下載圖片文件,對其餘類型能夠經過改動實現。url

該方式下載很快。blog

相關文章
相關標籤/搜索