readfile和file_put_contents下载远程图片到本地
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?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下载远程图片到本地
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php $ch = curl_init(); $fp = fopen ( './girl.jpg' , 'w' ); 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 ); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | /** * 下载远程图片到本地 * * @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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <?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' ; |
注:代码说明
1 2 | curl_setopt( $ch , CURLOPT_SSL_VERIFYPEER, false); curl_setopt( $ch , CURLOPT_SSL_VERIFYHOST, false); |
可忽略ssl认证,对于图片https协议失效的情况可以忽略验证,正常访问。
同样的,使用 file_get_contents
函数忽略https认证的话可以使用如何代码实现:
1 2 3 4 5 6 7 8 | $stream_opts = [ "ssl" => [ "verify_peer" =>false, "verify_peer_name" =>false, ] ]; $cdata = file_get_contents ( $url ,false, stream_context_create( $stream_opts )); |