<?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. 十、springcloud之Consul注销实例

    @Autowired //com.ecwid.consul.v1.ConsulClient private ConsulClient consulClient; @PostMapping(" ...

  2. Runtime.getRuntime().exec 类 防止阻塞

    import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; impor ...

  3. Session和Cookie,Django的自动登录机制

    什么是Cookie? Cookie是浏览器的本地存储机制,存储服务器返回的各种信息,下次发起请求时再发送给服务端,比如访问baidu 什么是Session? 刚才说道,Cookie存储服务端返回的信息 ...

  4. BatchNorm caffe源码

    1.计算的均值和方差是channel的 2.test/predict 或者use_global_stats的时候,直接使用moving average use_global_stats 表示是否使用全 ...

  5. mybatis 易百练习笔记

    1. session.commit()  增删改需要提交     session.close()    session需要关闭 2. insert  into t()   values()  不用写i ...

  6. HDU 2609 How many(最小表示+set)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2609 题目大意: 题目大意有n个有01组成的字符串,每个字符串都代表一个项链,那么该字符串就是一个环状 ...

  7. ubuntu和windows双系统启动顺序的修改

    ubuntu和windows双系统启动顺序的修改 说到启动就不得不说GRUB,Linux下大名鼎鼎的启动管理工具(曾经的LILO已经风光不再),当然现在已经是GRUB2了,GRUB2和GRUB最重要的 ...

  8. 使用Kafka、Elasticsearch、Grafana搭建业务监控系统(三)Elasticsearch

    https://blog.csdn.net/tonywu1992/article/details/83576863

  9. Web Api之Cors跨域以及其他跨域方式(三)

    我们知道ajax不能跨域访问,但是有时我们确实需要跨域访问获取数据,所以JSONP就此诞生了,其本质使用的是Script标签,除JSONP以外还有另外实现跨域方式 一.手动实现JSONP跨域 1.首先 ...

  10. 【AtCoder】AGC011 E - Increasing Numbers

    题解 题是真的好,我是真的不会做 智商本还是要多开啊QwQ 我们发现一个非下降的数字一定可以用不超过九个1111111111...1111表示 那么我们可以得到这样的一个式子,假如我们用了k个数,那么 ...