1.获取远程文件大小及信息的函数

function getFileSize($url){ 
         $url = parse_url($url); 
         if($fp = @fsockopen($url[’host’],empty($url[’port’])?80:$url[’port’],$error)){ 
                 fputs($fp,"GET ".(empty($url[’path’])?’/’:$url[’path’])." HTTP/1.1\r\n"); 
                 fputs($fp,"Host:$url[host]\r\n\r\n"); 
                 while(!feof($fp)){ 
                         $tmp = fgets($fp); 
                         if(trim($tmp) == ’’){ 
                                 break; 
                         }else if(preg_match(’/Content-Length:(.*)/si’,$tmp,$arr)){ 
                                 return trim($arr[1]); 
                         } 
                 } 
                 return null; 
         }else{ 
                 return null; 
         } 

echo getFileSize("http://www.dianpub.com/download/xml.rar")

2.图片

//记录程序开始的时间
$BeginTime=getmicrotime();

function GrabImage($url,$filename="") { 
if($url==""):return false;endif; 
if($filename=="") { 
$ext=strrchr($url,"."); 
if($ext!=".gif" && $ext!=".jpg"):return false;endif; 
$filename=date("dMYHis").$ext; 

ob_start(); 
readfile($url); 
$img = ob_get_contents(); 
ob_end_clean(); 
$size = strlen($img); 
$fp2=@fopen($filename, "a"); 
fwrite($fp2,$img); 
fclose($fp2); 
return $filename; 
}

$img=GrabImage("http://www.dianpub.com/images/_1978837_detector_ap100.jpg",""); 
if($img):echo '<pre><img src="'.$img.'"></pre>';else:echo "false";endif;

//记录程序运行结束的时间
$EndTime=getmicrotime();

//返回运行时间
exit($EndTime-$BeginTime);

3.全文下载图片

if(!empty($saveremoteimg)) 

$body = stripslashes($body); 
$img_array = array(); 
preg_match_all("/(src|SRC)=[\"|'| ]{0,}(http:\/\/(.*)\.(gif|jpg|jpeg|bmp|png))/isU",$body,$img_array); 
$img_array = array_unique($img_array[2]); 
set_time_limit(0); 
$imgUrl = $img_dir."/".strftime("%Y%m%d",time()); 
$imgPath = $base_dir.$imgUrl; 
$milliSecond = strftime("%H%M%S",time()); 
if(!is_dir($imgPath)) @mkdir($imgPath,0777); 
foreach($img_array as $key =>$value) 

$value = trim($value); 
$get_file = @file_get_contents($value); 
$rndFileName = $imgPath."/".$milliSecond.$key.".".substr($value,-3,3); 
$fileurl = $imgUrl."/".$milliSecond.$key.".".substr($value,-3,3); 
if($get_file) 

$fp = @fopen($rndFileName,"w"); 
@fwrite($fp,$get_file); 
@fclose($fp); 

$body = ereg_replace($value,$fileurl,$body); 

$body = addslashes($body); 
}

4.PHP远程文件下载类(支持断点续传)

1).功能:支持断点续传的下载,能计算传输率,能控制传输率

简易使用方法:

$object = new httpdownload();
$object->set_byfile($file);//服务器文件名,包括路径
$object->filename = $filename;//下载另存为的文件名
$object->download();

类文件:

<?
      class httpdownload { 
      var $data = null; 
      var $data_len = 0; 
      var $data_mod = 0; 
      var $data_type = 0; 
      var $data_section = 0; //section download 
      var $sentSize=0; 
      var $handler = array('auth' => null); 
      var $use_resume = true; 
      var $use_autoexit = false; 
      var $use_auth = false; 
      var $filename = null; 
      var $mime = null; 
      var $bufsize = 2048; 
      var $seek_start = 0; 
      var $seek_end = -1; 
      var $totalsizeref = 0; 
      var $bandwidth = 0; 
      var $speed = 0; 
      function initialize() { 
            global $HTTP_SERVER_VARS; 
            if ($this->use_auth) //use authentication { 
                  if (!$this->_auth()) //no authentication { 
                          header('WWW-Authenticate: Basic realm="Please enter your username and password"'); 
                          header('HTTP/1.0 401 Unauthorized'); 
                          header('status: 401 Unauthorized'); 
                          if ($this->use_autoexit) exit(); 
                          return false; 
                  } 
            } 
            if ($this->mime == null) $this->mime = "application/octet-stream"; //default mime 
            if (isset($_SERVER['HTTP_RANGE']) || isset($HTTP_SERVER_VARS['HTTP_RANGE'])) { 
                  if (isset($HTTP_SERVER_VARS['HTTP_RANGE'])) $seek_range = substr($HTTP_SERVER_VARS['HTTP_RANGE'] , strlen('bytes=')); 
                  else $seek_range = substr($_SERVER['HTTP_RANGE'] , strlen('bytes=')); 
            $range = explode('-',$seek_range); 
            if ($range[0] > 0) { 
                  $this->seek_start = intval($range[0]); 
            } 
            if ($range[1] > 0) $this->seek_end = intval($range[1]); 
            else $this->seek_end = -1; 
            if (!$this->use_resume) { 
                  $this->seek_start = 0; 
                  //header("HTTP/1.0 404 Bad Request"); 
                  //header("Status: 400 Bad Request"); 
                  //exit; 
                  //return false; 
            } else { 
                  $this->data_section = 1; 
            } 
      } else { 
            $this->seek_start = 0; 
            $this->seek_end = -1; 
      } 
      $this->sentSize=0; 
      return true;
}
function header($size,$seek_start=null,$seek_end=null) { 
      header('Content-type: ' . $this->mime); 
      header('Content-Disposition: attachment; filename="' . $this->filename . '"'); 
      header('Last-Modified: ' . date('D, d M Y H:i:s \G\M\T' , $this->data_mod)); 
      if ($this->data_section && $this->use_resume) { 
            header("HTTP/1.0 206 Partial Content"); 
            header("Status: 206 Partial Content"); 
            header('Accept-Ranges: bytes'); 
            header("Content-Range: bytes $seek_start-$seek_end/$size"); 
            header("Content-Length: " . ($seek_end - $seek_start + 1)); 
      } else { 
            header("Content-Length: $size"); 
      }
}
function download_ex($size) { 
      if (!$this->initialize()) return false; 
      ignore_user_abort(true); 
      //Use seek end here 
      if ($this->seek_start > ($size - 1)) $this->seek_start = 0; 
      if ($this->seek_end <= 0) $this->seek_end = $size - 1; 
      $this->header($size,$seek,$this->seek_end); 
      $this->data_mod = time(); 
      return true;
}
function download() { 
      if (!$this->initialize()) return false; 
      try { 
            error_log("begin download\n", 3,"/usr/local/www/apache22/LOGS/apache22_php.err"); 
            $seek = $this->seek_start; 
            $speed = $this->speed; 
            $bufsize = $this->bufsize; 
            $packet = 1; 
            //do some clean up 
            @ob_end_clean(); 
            $old_status = ignore_user_abort(true); 
            @set_time_limit(0); 
            $this->bandwidth = 0; 
            $size = $this->data_len; 
            if ($this->data_type == 0) //download from a file { 
                  $size = filesize($this->data); 
                  if ($seek > ($size - 1)) $seek = 0; 
                  if ($this->filename == null) $this->filename = basename($this->data); 
                  $res = fopen($this->data,'rb'); 
                  if ($seek) fseek($res , $seek); 
                  if ($this->seek_end < $seek) $this->seek_end = $size - 1; 
                  $this->header($size,$seek,$this->seek_end); //always use the last seek 
                  $size = $this->seek_end - $seek + 1; 
                  while (!(connection_aborted() || connection_status() == 1) && $size > 0) { 
                        if ($size < $bufsize) { 
                              echo fread($res , $size); 
                              $this->bandwidth += $size; 
                              $this->sentSize+=$size; 
                        } else { 
                        echo fread($res , $bufsize); 
                        $this->bandwidth += $bufsize; 
                        $this->sentSize+=$bufsize; 
                  } 
                  $size -= $bufsize; 
                  flush(); 
                  if ($speed > 0 && ($this->bandwidth > $speed*$packet*1024)) { 
                        sleep(1); 
                        $packet++; 
                  } 
            } 
            fclose($res); 
      } 
      elseif ($this->data_type == 1) //download from a string 
      { 
            if ($seek > ($size - 1)) $seek = 0; 
            if ($this->seek_end < $seek) $this->seek_end = $this->data_len - 1; 
            $this->data = substr($this->data , $seek , $this->seek_end - $seek + 1); 
            if ($this->filename == null) $this->filename = time(); 
            $size = strlen($this->data); 
            $this->header($this->data_len,$seek,$this->seek_end); 
            while (!connection_aborted() && $size > 0) { 
                  if ($size < $bufsize) { 
                        $this->bandwidth += $size; 
                        $this->sentSize+=$size; 
                  } else { 
                        $this->bandwidth += $bufsize; 
                        $this->sentSize+=$bufsize; 
                  } 
                  echo substr($this->data , 0 , $bufsize); 
                  $this->data = substr($this->data , $bufsize); 
                  $size -= $bufsize; 
                  flush(); 
                  if ($speed > 0 && ($this->bandwidth > $speed*$packet*1024)) { 
                        sleep(1); 
                        $packet++; 
                  } 
            } 
      } else if ($this->data_type == 2) { 
            //just send a redirect header 
            header('location: ' . $this->data); 
      } 
      if($this->totalsizeref==$this->sentSize )error_log("end download\n", 3,"/usr/local/www/apache22/LOGS/apache22_php.err"); 
      else error_log("download is canceled\n", 3,"/usr/local/www/apache22/LOGS/apache22_php.err"); 
      if ($this->use_autoexit) exit(); 
      //restore old status 
      ignore_user_abort($old_status); 
      set_time_limit(ini_get("max_execution_time")); 
}
catch(Exception $e) { 
      error_log("cancel download\n".$e, 3,"/usr/local/www/apache22/LOGS/apache22_php.err");

      return true;
}
function set_byfile($dir) { 
      if (is_readable($dir) && is_file($dir)) { 
            $this->data_len = 0; 
            $this->data = $dir; 
            $this->data_type = 0; 
            $this->data_mod = filemtime($dir); 
            $this->totalsizeref = filesize($dir); 
            return true; 
      } else return false;
}
function set_bydata($data) { 
      if ($data == '') return false; 
            $this->data = $data; 
            $this->data_len = strlen($data); 
            $this->data_type = 1; 
            $this->data_mod = time(); 
            return true;
}
function set_byurl($data) { 
      $this->data = $data; 
      $this->data_len = 0; 
      $this->data_type = 2; 
      return true;
}
function set_lastmodtime($time) { 
      $time = intval($time); 
      if ($time <= 0) $time = time(); 
      $this->data_mod = $time;
}
function _auth() { 
      if (!isset($_SERVER['PHP_AUTH_USER'])) return false; 
      if (isset($this->handler['auth']) && function_exists($this->handler['auth'])) { 
            return $this->handler['auth']('auth' , $_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']); 
      } else return true; //you must use a handler 
      }
}
?>

5. php 使用GD库下载远程图片

<?php   
$imgname = "http://imgdujia.kuxun.cn/newpic/929/812929/4.jpg";   
$src_im = imagecreatefromjpeg($imgname);   
$srcW = ImageSX($src_im);                                                       //获得图像的宽   
$srcH = ImageSY($src_im);                                                       //获得图像的高

$dst_im = ImageCreateTrueColor($srcW,$srcH);                    //创建新的图像对象

imagecopy($dst_im, $src_im, 0, 0, 0, 0, $srcW, $srcH);   
imagejpeg($dst_im, "newpic.jpg");                                               //创建缩略图文件

echo "<img src="newpic.jpg" mce_src="newpic.jpg"></img>";

?>

<?php
header("Content-type: image/png");
$im = imagecreatefromjpeg("http://postimg.mop.com/200602/02/74/122374/200602022335325121.JPG");
$white = imagecolorallocate($im, 0xF9, 0xD7, 0xCD);
imagefill($im, 0, 0,$white);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5,   "A Simple Text String", $text_color);
imagepng($im);
imagedestroy($im);
?>

注意这个要把PHP分配内存调大,应用时用大内存服务器

php 下载远程图片 的几种方法(转)的更多相关文章

  1. PHP下载远程图片的几种方法总结

    1. 使用file_get_contents function dlfile($file_url, $save_to) { $content = file_get_contents($file_url ...

  2. PHP下载远程文件的3种方法以及性能考虑

    今天在做导出Excel的时候,总是要测试导出的Excel文件,频繁的下载和打开,很麻烦 就想着写段代码一气呵成  服务端导出Excel==>下载Excel文件到本地==>并打开的操作. 这 ...

  3. PHP下载远程图片的3个方法

    From: http://blog.csdn.net/iefreer/article/details/46930239 直接上代码 <?php function dlfile1($file_ur ...

  4. 织梦dedecms 无法下载远程图片 fsockopen函数被禁用的解决方法

    在linux服务器上fsockopen()函数被无情的禁用了(这其实是出于安全考虑,可以理解),下载远程图片的功能就没有办法使用了.找了一些资料之后,找到了解决方法,就是用stream_socket_ ...

  5. 前端下载图片的N种方法

    前几天一个简单的下载图片的需求折腾了我后端大佬好几天,最终还是需要前端来搞,开始说不行的笔者最后又行了,所以趁着这个机会来总结一下下载图片到底有多少种方法. 先起个服务 使用expressjs起个简单 ...

  6. php下载远程图片方法总结(curl手动解析header)curl跳转问题解决

    常用方法一般有:. file_get_contents file_put_contents readfile($file) //效率很高. 一般代码: /** * 抓取远程图片 * * @param ...

  7. php下载远程图片到本地

    在使用 PHP 做简单的爬虫的时候,我们经常会遇到需要下载远程图片的需求,所以下面来简单实现这个需求1:使用curl 比如我们有下面这两张图片: $images = [ 'https://img.al ...

  8. Spring官网下载dist.zip的几种方法

    Spring官网下载dist.zip的几种方法   Spring官网改版后,很多项目的完整zip包下载链接已经隐掉了,虽然Spring旨在引导大家用更“高大上”的maven方式来管理所依赖的jar包, ...

  9. MYSQL加入远程用户或同意远程訪问三种方法

    加入远程用户admin密码为password GRANT ALL PRIVILEGES ON *.* TO admin@localhost IDENTIFIED BY \'password\' WIT ...

随机推荐

  1. cocos2d anchor point 锚点解析

    anchor point 究竟是怎么回事? 之所以造成不容易理解的是因为我们平时看待一个图片是 以图片的中心点 这一个维度来决定图片的位置的.而在cocos2d中决定一个 图片的位置是由两个维度 一个 ...

  2. 解决Windows 7删除执行过的 EXE、Bat文件有延迟的问题

    解决了困扰已久的问题,真是大快人心啊! Win7删除exe文件刷新重现及删除慢问题解决方法 - DragonCheng的专栏 - 博客频道 - CSDN.NET Win7删除exe文件刷新重现及删除慢 ...

  3. PHP 实现下载文件的方法

    方法一: header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); ...

  4. dbms_file_transfer使用简介

    dbms_file_transfer这个包可以在两个位置传输文件,分别可以有以下位置: a 从一个asm diskgroup传输到另外一个asm diskgroup b 从一个asm diskgrou ...

  5. LeetCode题解——4Sum

    题目: 给定一个数组,找出其中和为0的所有4个数组合,每个组合内的4个数非递降. 解法: ①先排序,然后利用4个指针,前两个遍历,后两个在第二个指针之后的部分里夹逼,时间O(N3). ②或者利用一个哈 ...

  6. vs2010 无法连接到asp.net development server

    http://blog.csdn.net/xqf309/article/details/7881257 今天打开之前的程序,按了F5进行调试,等了会弹出窗体来说:无法连接到asp.net develo ...

  7. <Chapter 2>2-2-2.开发Python应用(Developing a Python App)

    对App Engine来讲最简单的Python应用是一个有两个文件的简单目录:一个称为app.yaml的配置文件,一个用于请求处理器的Python代码文件.包含app.yaml文件的这个目录就是这个应 ...

  8. 读取jar内的配置文件

    读取jar包内的配置文件,可以使用ResourceBundle,具体具体例子如下 import java.io.BufferedInputStream; import java.io.IOExcept ...

  9. [置顶] Kendo UI开发教程: Kendo UI 示例及总结

    前面基本介绍完Kendo UI开发的基本概念和开发步骤,Kendo UI的示例网站为http://demos.kendoui.com/ ,包含了三个部分 Web DemoMobile DemoData ...

  10. redis高级实用特性

    1. 安全性 2. 主从复制 3. 事务处理 4. 持久化机制 5. 发布订阅消息 : 可以做一个消息系统 6. 虚拟内存的使用 一 . 安全性 设置客户端连接后进行任何其他指定前需要使用的密码 . ...