天天看點

PHP通過curl遠端擷取圖像并儲存到本地

适用場景:

1.下載下傳未知檔案

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

$img2 = "http://wx.qlogo.cn/mmopen/ajNVdqHZLLDJCbZ1ujKLbWzUI3VicJ4GlKP6Ds9CziapRF93VRKb9CVvZRBHtIbnuHlDVn0A2Ufx67thE30QlCBA/0“;

如上都是圖檔turl,在浏覽器打開,可以看到是圖檔,但是從URL中看不出來,上面來自微信的頭像,如果想把圖檔拉取到自己的伺服器,可以使用下面的方法。

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;
}
           

上面的函數隻适用于下載下傳圖檔檔案,對其他類型可以通過改動實作。

該方式下載下傳很快。

轉載于:https://www.cnblogs.com/wyzs/p/7419262.html

php