<?php
if(!function_exists("remote_filesize")){
/**
* 获取远程或本地文件信息
* @param string $strUrl 远程文件或本地文件地址
* @param integer $intType 调用方式(1:get_headers 2:fsocketopen 3:curl 4:本地文件)
* @param array $arrOptional
* @return array
* @author mengdj<mengdj@outlook.com>
*/
function remote_filesize($strUrl,$intType=1,$arrOptional=array()){
$arrRet=array(
"length"=>0, //大小,字节为单位
"mime"=>"", //mime类型
"filename"=>"", //文件名
"status"=>0 //状态码
);
switch($intType){
case 1:
//利用get_headers函数
if(($arrTmp=get_headers($strUrl,true))){
$arrRet=array("length"=>$arrTmp['Content-Length'],"mime"=>$arrTmp['Content-Type']);
if(preg_match('/filename=\"(.*)\"/si',$arrTmp['Content-Disposition'],$arr)){
$arrRet["filename"]=$arr[1];
}
if(preg_match('/\s(\d+)\s/',$arrTmp[0],$arr)){
$arrRet["status"]=$arr[1];
}
}
break;
case 2:
//利用fsocket
if(($arrUrl=parse_url($strUrl))){
if($fp=@fsockopen($arrUrl['host'],empty($arrUrl['port'])?80:$arrUrl['port'],$error)){
@fputs($fp,"GET ".(empty($arrUrl['path'])?'/':$arrUrl['path'])." HTTP/1.1\r\n");
@fputs($fp,"Host: $arrUrl[host]\r\n");
@fputs($fp,"Connection: Close\r\n\r\n");
while(!feof($fp)){
$tmp=fgets($fp);
if(trim($tmp)==''){
//此行代码只读到头信息即可
break;
}else{
(preg_match('/(HTTP.*)(\s\d{3}\s)/',$tmp,$arr))&&$arrRet['status']=trim($arr[2]);
(preg_match('/Content-Length:(.*)/si',$tmp,$arr))&&$arrRet['length']=trim($arr[1]);
(preg_match('/Content-Type:(.*)/si',$tmp,$arr))&&$arrRet['mime']=trim($arr[1]);
(preg_match('/filename=\"(.*)\"/si',$tmp,$arr))&&$arrRet['filename']=trim($arr[1]);
}
}
@fclose($fp);
}
}
break;
case 3:
//利用curl
if(($ch=curl_init($strUrl))){
curl_setopt($ch,CURLOPT_HEADER,1);
curl_setopt($ch,CURLOPT_NOBODY,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
if(isset($arrOptional['user'])&&isset($arrOptional['password'])){
$headers=array('Authorization: Basic '.base64_encode($arrOptional['user'].':'.$arrOptional['password']));
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
}
$tmp=curl_exec($ch);
curl_close($ch);
(preg_match('/Content-Length:\s([0-9].+?)\s/',$tmp,$arr))&&$arrRet['length']=trim($arr[1]);
(preg_match('/Content-Type:\s(.*)\s/',$tmp,$arr))&&$arrRet['mime']=trim($arr[1]);
(preg_match('/filename=\"(.*)\"/i',$tmp,$arr))&&$arrRet['filename']=trim($arr[1]);
(preg_match('/(HTTP.*)(\s\d{3}\s)/',$tmp,$arr))&&$arrRet['status']=trim($arr[2]);
}
break;
case 4:
//本地处理
if(file_exists($strUrl)) {
$arrRet=array(
"length"=>filesize($strUrl),
"mime" =>mime_content_type($strUrl),
"filename"=>basename($strUrl),
"status"=>200
);
}else{
$arrRet=array(
"length"=>0,
"mime" =>'',
"filename"=>basename($strUrl),
"status"=>404
);
}
break;
}
if(isset($arrOptional['getimagesize'])&&$arrRet['status']=='200'){
if(($arrTmp=@getimagesize($strUrl))){
$arrRet['width']=$arrTmp[0];
$arrRet['height']=$arrTmp[1];
$arrRet['type']=$arrTmp[2];
$arrRet['tag']=$arrTmp[3];
$arrRet['bits']=$arrTmp['bits'];
$arrRet['channels']=$arrTmp['channels'];
!isset($arrRet['mime'])&&$arrRet['mime']=$arrTmp['mime'];
}
}
return $arrRet;
}
}
/** End of file remote_filesize.php */

php远程获取图片或文件信息(get_headers,fsocketopen,curl)的更多相关文章

  1. C#远程获取图片文件流的方法【很通用】

    因为之前写的代码,也能获取到图片流信息,但是会是凌乱的线条,后百度得这个方法,必须记录一下 C# try { WebRequest myrequest = WebRequest.Create(Http ...

  2. C# 获取图片的EXIF 信息

    关于 EXIF 信息的介绍. 1  EXIF,是英文Exchangeable Image File(可交换图像文件)的缩写.EXIF是一种图像文件格式,只是文件的后缀名为jpg.EXIF信息是由数码相 ...

  3. 利用php获取图片完整Exif信息类 获取图片详细完整信息类

    <?php /** * @Author: TonyLevid * @Copyright: TonyLevid.com * @Name: Image Exif Class * @Version: ...

  4. WPF-TreeView获取文件夹目录、DataGrid获取目录下文件信息

    开发一个WPF桌面应用程序.刚接触WPF编程以及C#语言,这里把一些关键的问题记录下来. 下面是实现将路径的文件夹信息绑定到TreeView及DataGrid上显示. 关键问题是C#数据绑定方式及IE ...

  5. 获取图片的EXIF信息

    对于专业的摄影师来说,Exif信息是很重要的信息,也包含了非常多的东西 1.EXIF EXIF(Exchangeable Image File)是“可交换图像文件”的缩写,当中包含了专门为数码相机的照 ...

  6. js获取上传文件信息并及时查看

    <form id="picForm" name="picForm"  method="post" enctype="mult ...

  7. nodejs远程获取图片

    if(require("http")) {             var http = require("http");             http.g ...

  8. C# 远程获取图片二进制

    直接上代码, 紧做记录. public byte[] GetByteByImgUrl() { System.Net.WebRequest webreq = System.Net.WebRequest. ...

  9. JS图片加载时获取图片宽高信息

    ; var img = new Image(); img.src = node.find("img[class='img1_1']").attr("src"); ...

随机推荐

  1. 【小程序开发】购物车加减几件demo

    <!-- 主容器 --> <view class="stepper"> <!-- 减号 --> <text class="{{m ...

  2. Python基础三(选择,循环)

    序 首先我们知道程序的执行有三种结构:顺序.选择.循环三种结构,而为了方便我们书写和多次利用我们就需要把一段代码封装器来,这就是方法.今天我就说的是程序的基本结构的格式和方法. 注:所有的程序都可以通 ...

  3. Java HashCode详解

    一.为什么要有Hash算法 Java中的集合有两类,一类是List,一类是Set.List内的元素是有序的,元素可以重复.Set元素无序,但元素不可重复.要想保证元素不重复,两个元素是否重复应该依据什 ...

  4. 蛮力法解决0_1背包问题新思路-——利用C语言位域类型

    废话不说了,直接上代码 #include<stdio.h> #include<math.h> #define N 5 //物品种类数目 #define CAPACITY 6 / ...

  5. 【Netty官方文档翻译】引用计数对象(reference counted objects)

    知乎有关于引用计数和垃圾回收GC两种方式的详细讲解 https://www.zhihu.com/question/21539353 原文出处:http://netty.io/wiki/referenc ...

  6. kafka介绍与搭建(单机版)

    一.kafka介绍 1.1 主要功能 根据官网的介绍,ApacheKafka®是一个分布式流媒体平台,它主要有3种功能: 1:It lets you publish and subscribe to ...

  7. 20165203 实验三 敏捷开发与XP实践

    20165203 实验三 敏捷开发与XP实践 任务一: 1.实验要求 实验三 敏捷开发与XP实践 (http://www.cnblogs.com/rocedu/p/4795776.html), Ecl ...

  8. WORDPRESS登录后台半天都无法访问或者是访问慢的解决方法

    wordpress登录后台如果打开速度慢,一般分为两部分,第一部分是php虚拟主机的原因,其中主机的原因,又分为很多种情况.第二部分就是WordPress程序本身的问题.这里无忧主机小编主要是讲第二部 ...

  9. box-sizing 盒子模型不改变大小

    参考 box-sizing 相关说明 在需要设置元素的内边距或者外边距而不想改变整体大小时,可以使用该属性,记录之. .simple { width: 500px; margin: 20px auto ...

  10. 【51nod】1709 复杂度分析

    题解 考虑朴素的暴力,相当于枚举u点的每个祖先f,然后统计一下这个点f除了某个儿子里有u的那个子树之外的节点个数,乘上f到u距离的二进制1的个数 那么我们用倍增来实现这个东西,每次枚举二进制的最高位j ...