最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
PHP下载采集图片到本地的方法详解【可忽略ssl认证】
时间:2026-09-23 12:10:01 编辑:袖梨 来源:一聚教程网
这篇文章主要介绍了PHP下载采集图片到本地的方法,结合实例形式详细分析了php基于Curl远程获取远程图片资源到本地的相关操作技巧与注意事项,需要的朋友可以参考下
readfile和file_put_contents下载远程图片到本地
<?phpfunction download_image($pic_url){$time = time();$pic_local_path = dirname(__FILE__) . '/cache';$pic_local = $pic_local_path . '/' . $time;if (!file_exists($pic_local_path)) {mkdir($pic_local_path, 0777);@chmod($pic_local_path, 0777);}ob_start(); //打开输出readfile($pic_url); //输出图片文件$img = ob_get_contents(); //得到浏览器输出ob_end_clean(); //清除输出并关闭file_put_contents($pic_local, $img);return $pic_local;}
curl下载远程图片到本地
<?php$ch = curl_init();$fp=fopen('./girl.jpg', 'w');curl_setopt($ch, CURLOPT_URL, "https:https://img02.*s*ogouc*dn.com/app/a/100520091/20181209114105");curl_setopt($ch, CURLOPT_FAILONERROR, true);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 100);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);curl_setopt($ch, CURLOPT_FILE, $fp); $output = curl_exec($ch);$info = curl_getinfo($ch);$error = curl_error($ch);fclose($fp);$size = filesize("./girl.jpg");if ($size != $info['size_download']) {echo "下载失败";echo $error;} else {echo "下载成功";}curl_close($ch);
/** * 下载远程图片到本地 * * @param string $url 远程文件地址 * @param string $filename 保存后的文件名(为空时则为随机生成的文件名,否则为原文件名) * @param array $fileType 允许的文件类型 * @param string $dirName 文件保存的路径(路径其余部分根据时间系统自动生成) * @param int $type 远程获取文件的方式 * @return json 返回文件名、文件的保存路径 * @author blog.snsgou.com */function download_image($url, $fileName = '', $dirName, $fileType = array('jpg', 'gif', 'png'), $type = 1){if ($url == ''){return false;}// 获取文件原文件名$defaultFileName = basename($url);// 获取文件类型$suffix = substr(strrchr($url, '.'), 1);if (!in_array($suffix, $fileType)){return false;}// 设置保存后的文件名$fileName = $fileName == '' ? time() . rand(0, 9) . '.' . $suffix : $defaultFileName;// 获取远程文件资源if ($type){$ch = curl_init();$timeout = 30;curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);$file = curl_exec($ch);curl_close($ch);}else{ob_start();readfile($url);$file = ob_get_contents();ob_end_clean();}// 设置文件保存路径//$dirName = $dirName . '/' . date('Y', time()) . '/' . date('m', time()) . '/' . date('d', time());$dirName = $dirName . '/' . date('Ym', time());if (!file_exists($dirName)){mkdir($dirName, 0777, true);}// 保存文件$res = fopen($dirName . '/' . $fileName, 'a');fwrite($res, $file);fclose($res);return array('fileName' => $fileName,'saveDir' => $dirName);}
PHP读写大 二进制 文件
不必申请很大内存(fopen、fread、fwrite、fclose)
<?php/** * 读写大二进制文件,不必申请很大内存 * 只有读取到内容才创建文件 * 保证目录可写 * * @param string $srcPath 源文件路径 * @param string $dstPath 目标文件路径 * @return bool */function fetch_big_file($srcPath, $dstPath){set_time_limit(0); // 设置脚本执行时间无限长if (!$fpSrc = fopen($srcPath, "rb")){return false;}$isWriteFileOpen = false; // 写文件 是否已打开?do{$data = fread($fpSrc, 8192); // 每次读取 8*1024个字节if (!$data){break;}else if (!$isWriteFileOpen){// 第一次读取文件,并且有内容,才创建文件$fpDst = fopen($dstPath, "wb");$isWriteFileOpen = true;fwrite($fpDst, $data);}else{// 写入fwrite($fpDst, $data);}} while (true);fclose($fpSrc);fclose($fpDst);return true;}$srcPath = 'd:/big.pdf';$dstPath = 'Z:/big.pdf';fetch_big_file($srcPath, $dstPath);echo 'success';
注:代码说明
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
可忽略ssl认证,对于图片https协议失效的情况可以忽略验证,正常访问。
同样的,使用 file_get_contents 函数忽略https认证的话可以使用如何代码实现:
$url = 'https:https://img02.*s*ogouc*dn.com/app/a/100520091/20181209114105';$stream_opts = [ "ssl" => [ "verify_peer"=>false, "verify_peer_name"=>false, ]];$cdata = file_get_contents($url,false, stream_context_create($stream_opts));