• PHP通过curl远程获取图像并保存到本地


    适用场景:

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

    上面的函数只适用于下载图片文件,对其他类型可以通过改动实现。

    该方式下载很快。

  • 相关阅读:
    Jmeter非GUI模式运行脚本
    vmware下 linux如何扩展磁盘空间
    (完美解决方案)Windows Server 2012 R2报错:无法启动此程序,因为计算机中丢失 apimswincrtstdiol110.dll 解决
    Python程序执行性能优化心得
    jmeter中TPS和吞吐量区别与联系
    Python多进程之Pool进程池浅析
    为什么Jmeter 运行时到达持续时间不停止?
    一些在线实用小工具
    笔记20171225
    JMeter 安装 linux平台
  • 原文地址:https://www.cnblogs.com/wyzs/p/7419262.html
Copyright © 2020-2023  润新知