php 下载远程图片 的几种方法
1.获取远程文件大小及信息的函数
<?php
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.图片
<?php
//记录程序开始的时间
$BeginTime = getmicrotime();
function GrabImage($url, $filename = "")
{
if ("" == $url): return false;
if ("" == $filename) {
$ext = strrchr($url, ".");
if (".gif" != $ext && ".jpg" != $ext): return false;
$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";
//记录程序运行结束的时间
$EndTime = getmicrotime();
//返回运行时间
exit($EndTime - $BeginTime);
3.全文下载图片
<?php
if (!empty($saveremoteimg)) {
$body = stripslashes($body);
$img_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).功能:支持断点续传的下载,能计算传输率,能控制传输率
简易使用方法:
<?php
$object = new httpdownload();
$object->set_byfile($file);//服务器文件名,包括路径
$object->filename = $filename;//下载另存为的文件名
$object->download();
类文件:
<?php
class httpdownload
{
public $data = null;
public $data_len = 0;
public $data_mod = 0;
public $data_type = 0;
public $data_section = 0; //section download
public $sentSize = 0;
public $handler = ['auth' => null];
public $use_resume = true;
public $use_autoexit = false;
public $use_auth = false;
public $filename = null;
public $mime = null;
public $bufsize = 2048;
public $seek_start = 0;
public $seek_end = -1;
public $totalsizeref = 0;
public $bandwidth = 0;
public $speed = 0;
public function initialize()
{
global $HTTP_SERVER_VARS;
if ($this->use_auth) {
if (!$this->_auth()) {
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 (null == $this->mime) {
$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;
}
public 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");
}
}
public 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;
}
public 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 (0 == $this->data_type) //download from a file {
{
$size = filesize($this->data);
}
if ($seek > ($size - 1)) {
$seek = 0;
}
if (null == $this->filename) {
$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);
if (1 == $this->data_type) //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 (null == $this->filename) {
$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 (2 == $this->data_type) {
//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;
}
public 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;
}
}
public 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;
}
public function set_byurl($data)
{
$this->data = $data;
$this->data_len = 0;
$this->data_type = 2;
return true;
}
public function set_lastmodtime($time)
{
$time = intval($time);
if ($time <= 0) {
$time = time();
}
$this->data_mod = $time;
}
public 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);
版权声明
由 davidzhang创作并维护的 Gowhich博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于 博客( https://www.gowhich.com ),版权所有,侵权必究。
本文永久链接: https://www.gowhich.com/blog/37
版权声明
由 davidzhang创作并维护的 Gowhich博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于 Gowhich博客( https://www.gowhich.com ),版权所有,侵权必究。
本文永久链接: https://www.gowhich.com/blog/37