|
readfile和file_put_contents下载远程图片到本地
- <?php
- function 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://img02.sogoucdn.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协议失效的情况可以忽略验证,正常访问。
同样的,使用函数忽略https认证的话可以使用如何代码实现:- $url = 'https://img02.sogoucdn.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));
复制代码 来源:https://www.jb51.net/program/291529xf2.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
|