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

相关文章
相关标签/搜索