php远程获取图片或文件信息(get_headers, fsocketopen, curl)

<?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<[email protected]>
     */
    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[email protected]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;
    }
}

原文地址:https://www.cnblogs.com/kynewu/p/8944004.html

时间: 2024-11-05 21:59:03

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

批处理获取拖入文件信息

@ECHO OFF echo %1:获取拖入文件完整路径.如:"E:\DDC\add.txt"echo %~1:获取拖入文件完整路径,并去掉首尾引号.如:E:\DDC\add.txtecho %~nx1:获取拖入文件文件名及后缀.如:add.txtecho %~n1:获取拖入文件文件名.如:addecho %~x1:获取拖入文件后缀名.如:.txtecho %~dp1:获取拖入文件所在目录完整路径.如:E:\DDC\echo %cd%:获取拖入文件所在目录路径.如:E:\DDCecho

获取图片属性详细信息

获取图片属性详细信息,通过PIL库实现,PIL库为2.9.0(3.0版本以下) python代码实现 #-*-coding:utf8-*- from PIL import Image from PIL.ExifTags import TAGS img = Image.open("img.jpg") print img.size, img.format, img.mode, img.bits print dir(img) print hasattr(img, '_getexif') ex

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

这个是最近写的一个php获取图片Exif类,功能比较全面,也把所有的Exif都翻译了,执行效率也还可以. 唉,这次懒地写英文版了,以后有时间把英文版也做下.同样,不设置隐藏,也不需金钱. 因为这里不能贴链接,我博客里有个测试网页,大家如果有兴趣,可以去看看tonylevid.com 分两大模式:一个是已经转换数据的(如width:500px)用于显示:一个是未转换数据的如(width:500)用于用户自己自定义计算. 内置3种获取模式,用户可以自定义数组来获取. 注意:需在php.ini中开启m

php获取图片完整Exif信息类 获取图片详细完整信息类

首先解释一下什么是Exif.Exif是一种图象文件格式,它的数据存储与JPEG格式是完全相同的.实际上,Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈.快门.白平衡.ISO.焦距.日期时间等各种和拍摄条件以及相机品牌.型号.色彩编码.拍摄时录制的声音以及全球定位系统(GPS).缩略图等.简单地说,Exif=JPEG+拍摄参数.因此,你可以利用任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有的图形程序都能处理Exif信息. 开启PHP模块 默认情况下

java远程获取图片生成base64串

说下背景,项目中遇到前端js获取图片发生跨域的问题,服务器端又不支持匿名访问,只能通过服务器获取图片base64码进行展示.代码如下:下载 Java代码   /** * 远程读取image转换为Base64字符串 * @param imgUrl * @return */ private String Image2Base64(String imgUrl) { URL url = null; InputStream is = null; ByteArrayOutputStream outStrea

获取图片的EXIF信息

对于专业的摄影师来说,Exif信息是很重要的信息,也包含了非常多的东西 1.EXIF EXIF(Exchangeable Image File)是“可交换图像文件”的缩写,当中包含了专门为数码相机的照片而定制的元数据,可以记录数码照片的拍摄参数.缩略图及其他属性信息. Exif是一种图像文件格式,它的数据存储与JPEG格式是完全相同的.利用任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有的图形程序都能处理Exif信息. Exif 所记录的元数据信息非常丰富,主要包含了以下几

第十四篇:获取系统数据文件信息

前言 在 Linux 中,系统数据文件大都不能直接用编辑的方式读取.如此设计一方面是从安全性考虑,另一方面则是从文件检索效率考虑.本文将以口令文件 passwd 为例讲解读取 Linux 中系统数据文件的方法. 基本步骤 1. 包含读写该系统数据文件的专用头文件 ( 如读写口令文件要包含 pwd.h 组文件则是 grp.h ) 2. 使用 set 函数打开文件        3. 使用 get 函数读取下一个记录        4. 使用 end 函数关闭此文件 另,如果数据文件支持某种形式的关

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

<form id="picForm" name="picForm"  method="post" enctype="multipart/form-data"> <input type="file" id="photosfile" name="files" /> <button class="btn">请选择上传图

如何获取Info.plist文件信息

swift: NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] 比如: if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String { versionLabel.text = "Version. \(version)" } else