牛骨文教育服务平台(让学习变的简单)
博文笔记

php从服务器下载文件

创建时间:2014-04-22 投稿人: 浏览次数:714
class Http
{//类定义开始

    /**
     +----------------------------------------------------------
     * 采集远程文件
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @param string $remote 远程文件名
     * @param string $local 本地保存文件名
     +----------------------------------------------------------
     * @return mixed
     +----------------------------------------------------------
     */
    static public function curl_download($remote,$local) {
        $cp = curl_init($remote);
        $fp = fopen($local,"w");
        curl_setopt($cp, CURLOPT_FILE, $fp);
        curl_setopt($cp, CURLOPT_HEADER, 0);
        curl_exec($cp);
        curl_close($cp);
        fclose($fp);
    }

   /**
    +-----------------------------------------------------------
    * 使用 fsockopen 通过 HTTP 协议直接访问(采集)远程文件
    * 如果主机或服务器没有开启 CURL 扩展可考虑使用
    * fsockopen 比 CURL 稍慢,但性能稳定
    +-----------------------------------------------------------
    * @static
    * @access public
    +-----------------------------------------------------------
    * @param string $url 远程URL
    * @param array $conf 其他配置信息
    *        int   limit 分段读取字符个数
    *        string post  post的内容,字符串或数组,key=value&形式
    *        string cookie 携带cookie访问,该参数是cookie内容
    *        string ip    如果该参数传入,$url将不被使用,ip访问优先
    *        int    timeout 采集超时时间
    *        bool   block 是否阻塞访问,默认为true
    +-----------------------------------------------------------
    * @return mixed
    +-----------------------------------------------------------
    */
    static public function fsockopen_download($url, $conf = array()) {
        $return = "";
        if(!is_array($conf)) return $return;

        $matches = parse_url($url);
        !isset($matches["host"]) && $matches["host"] = "";
        !isset($matches["path"]) && $matches["path"] = "";
        !isset($matches["query"]) && $matches["query"] = "";
        !isset($matches["port"]) && $matches["port"] = "";
        $host = $matches["host"];
        $path = $matches["path"] ? $matches["path"].($matches["query"] ? "?".$matches["query"] : "") : "/";
        $port = !empty($matches["port"]) ? $matches["port"] : 80;

        $conf_arr = array(
            "limit"=>0,
            "post"=>"",
            "cookie"=>"",
            "ip"=>"",
            "timeout"=>15,
            "block"=>TRUE,
            );

        foreach (array_merge($conf_arr, $conf) as $k=>$v) ${$k} = $v;

        if($post) {
            if(is_array($post))
            {
                $post = http_build_query($post);
            }
            $out = "POST $path HTTP/1.0 ";
            $out .= "Accept: */* ";
            //$out .= "Referer: $boardurl ";
            $out .= "Accept-Language: zh-cn ";
            $out .= "Content-Type: application/x-www-form-urlencoded ";
            $out .= "User-Agent: $_SERVER[HTTP_USER_AGENT] ";
            $out .= "Host: $host ";
            $out .= "Content-Length: ".strlen($post)." ";
            $out .= "Connection: Close ";
            $out .= "Cache-Control: no-cache ";
            $out .= "Cookie: $cookie ";
            $out .= $post;
        } else {
            $out = "GET $path HTTP/1.0 ";
            $out .= "Accept: */* ";
            //$out .= "Referer: $boardurl ";
            $out .= "Accept-Language: zh-cn ";
            $out .= "User-Agent: $_SERVER[HTTP_USER_AGENT] ";
            $out .= "Host: $host ";
            $out .= "Connection: Close ";
            $out .= "Cookie: $cookie ";
        }
        $fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
        if(!$fp) {
            return "";
        } else {
            stream_set_blocking($fp, $block);
            stream_set_timeout($fp, $timeout);
            @fwrite($fp, $out);
            $status = stream_get_meta_data($fp);
            if(!$status["timed_out"]) {
                while (!feof($fp)) {
                    if(($header = @fgets($fp)) && ($header == " " ||  $header == " ")) {
                        break;
                    }
                }

                $stop = false;
                while(!feof($fp) && !$stop) {
                    $data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
                    $return .= $data;
                    if($limit) {
                        $limit -= strlen($data);
                        $stop = $limit <= 0;
                    }
                }
            }
            @fclose($fp);
            return $return;
        }
    }

    /**
     +----------------------------------------------------------
     * 下载文件
     * 可以指定下载显示的文件名,并自动发送相应的Header信息
     * 如果指定了content参数,则下载该参数的内容
     +----------------------------------------------------------
     * @static
     * @access public
     +----------------------------------------------------------
     * @param string $filename 下载文件名
     * @param string $showname 下载显示的文件名
     * @param string $content  下载的内容
     * @param integer $expire  下载内容浏览器缓存时间
     +----------------------------------------------------------
     * @return void
     +----------------------------------------------------------
     * @throws ThinkExecption
     +----------------------------------------------------------
     */
    static public function download ($filename, $showname="",$content="",$expire=180) {
        if(is_file($filename)) {
            $length = filesize($filename);
        }elseif(is_file(UPLOAD_PATH.$filename)) {
            $filename = UPLOAD_PATH.$filename;
            $length = filesize($filename);
        }elseif($content != "") {
            $length = strlen($content);
        }else {
            throw_exception($filename.L("下载文件不存在!"));
        }
        if(empty($showname)) {
            $showname = $filename;
        }
        $showname = basename($showname);
        if(!empty($filename)) {
            $type = mime_content_type($filename);
        }else{
            $type     =     "application/octet-stream";
        }
        //发送Http Header信息 开始下载
        header("Pragma: public");
        header("Cache-control: max-age=".$expire);
        //header("Cache-Control: no-store, no-cache, must-revalidate");
        header("Expires: " . gmdate("D, d M Y H:i:s",time()+$expire) . "GMT");
        header("Last-Modified: " . gmdate("D, d M Y H:i:s",time()) . "GMT");
        header("Content-Disposition: attachment; filename=".$showname);
        header("Content-Length: ".$length);
        header("Content-type: ".$type);
        header("Content-Encoding: none");
        header("Content-Transfer-Encoding: binary" );
        if($content == "" ) {
            readfile($filename);
        }else {
            echo($content);
        }
        exit();
    }

    /**
     +----------------------------------------------------------
     * 显示HTTP Header 信息
     +----------------------------------------------------------
     * @return string
     +----------------------------------------------------------
     */
    static function get_header_info($header="",$echo=true)
    {
        ob_start();
        $headers   = getallheaders();
        if(!empty($header)) {
            $info = $headers[$header];
            echo($header.":".$info." "); ;
        }else {
            foreach($headers as $key=>$val) {
                echo("$key:$val ");
            }
        }
        $output = ob_get_clean();
        if ($echo) {
            echo (nl2br($output));
        }else {
            return $output;
        }

    }

    /**
     * HTTP Protocol defined status codes
     * @param int $num
     */
    static function send_http_status($code) {
        static $_status = array(
            // Informational 1xx
            100 => "Continue",
            101 => "Switching Protocols",

            // Success 2xx
            200 => "OK",
            201 => "Created",
            202 => "Accepted",
            203 => "Non-Authoritative Information",
            204 => "No Content",
            205 => "Reset Content",
            206 => "Partial Content",

            // Redirection 3xx
            300 => "Multiple Choices",
            301 => "Moved Permanently",
            302 => "Found",  // 1.1
            303 => "See Other",
            304 => "Not Modified",
            305 => "Use Proxy",
            // 306 is deprecated but reserved
            307 => "Temporary Redirect",

            // Client Error 4xx
            400 => "Bad Request",
            401 => "Unauthorized",
            402 => "Payment Required",
            403 => "Forbidden",
            404 => "Not Found",
            405 => "Method Not Allowed",
            406 => "Not Acceptable",
            407 => "Proxy Authentication Required",
            408 => "Request Timeout",
            409 => "Conflict",
            410 => "Gone",
            411 => "Length Required",
            412 => "Precondition Failed",
            413 => "Request Entity Too Large",
            414 => "Request-URI Too Long",
            415 => "Unsupported Media Type",
            416 => "Requested Range Not Satisfiable",
            417 => "Expectation Failed",

            // Server Error 5xx
            500 => "Internal Server Error",
            501 => "Not Implemented",
            502 => "Bad Gateway",
            503 => "Service Unavailable",
            504 => "Gateway Timeout",
            505 => "HTTP Version Not Supported",
            509 => "Bandwidth Limit Exceeded"
        );
        if(array_key_exists($code,$_status)) {
            header("HTTP/1.1 ".$code." ".$_status[$code]);
        }
    }
}//类定义结束
if( !function_exists ("mime_content_type")) {
    /**
     +----------------------------------------------------------
     * 获取文件的mime_content类型
     +----------------------------------------------------------
     * @return string
     +----------------------------------------------------------
     */
    function mime_content_type($filename)
    {
       static $contentType = array(
                 "ai"    => "application/postscript",
                "aif"    => "audio/x-aiff",
                "aifc"    => "audio/x-aiff",
                "aiff"    => "audio/x-aiff",
                "asc"    => "application/pgp", //changed by skwashd - was text/plain
                "asf"    => "video/x-ms-asf",
                "asx"    => "video/x-ms-asf",
                "au"    => "audio/basic",
                "avi"    => "video/x-msvideo",
                "bcpio"    => "application/x-bcpio",
                "bin"    => "application/octet-stream",
                "bmp"    => "image/bmp",
                "c"    => "text/plain", // or "text/x-csrc", //added by skwashd
                "cc"    => "text/plain", // or "text/x-c++src", //added by skwashd
                "cs"    => "text/plain", //added by skwashd - for C# src
                "cpp"    => "text/x-c++src", //added by skwashd
                "cxx"    => "text/x-c++src", //added by skwashd
                "cdf"    => "application/x-netcdf",
                "class"    => "application/octet-stream",//secure but application/java-class is correct
                "com"    => "application/octet-stream",//added by skwashd
                "cpio"    => "application/x-cpio",
                "cpt"    => "application/mac-compactpro",
                "csh"    => "application/x-csh",
                "css"    => "text/css",
                "csv"    => "text/comma-separated-values",//added by skwashd
                "dcr"    => "application/x-director",
                "diff"    => "text/diff",
                "dir"    => "application/x-director",
                "dll"    => "application/octet-stream",
                "dms"    => "application/octet-stream",
                "doc"    => "application/msword",
                "dot"    => "application/msword",//added by skwashd
                "dvi"    => "application/x-dvi",
                "dxr"    => "application/x-director",
                "eps"    => "application/postscript",
                "etx"    => "text/x-setext",
                "exe"    => "application/octet-stream",
                "ez"    => "application/andrew-inset",
                "gif"    => "image/gif",
                "gtar"    => "application/x-gtar",
                "gz"    => "application/x-gzip",
                "h"    => "text/plain", // or "text/x-chdr",//added by skwashd
                "h++"    => "text/plain", // or "text/x-c++hdr", //added by skwashd
                "hh"    => "text/plain", // or "text/x-c++hdr", //added by skwashd
                "hpp"    => "text/plain", // or "text/x-c++hdr", //added by skwashd
                "hxx"    => "text/plain", // or "text/x-c++hdr", //added by skwashd
                "hdf"    => "application/x-hdf",
                "hqx"    => "application/mac-binhex40",
                "htm"    => "text/html",
                "html"    => "text/html",
                "ice"    => "x-conference/x-cooltalk",
                "ics"    => "text/calendar",
                "ief"    => "image/ief",
                "ifb"    => "text/calendar",
                "iges"    => "model/iges",
                "igs"    => "model/iges",
                "jar"    => "application/x-jar", //added by skwashd - alternative mime type
                "java"    => "text/x-java-source", //added by skwashd
                "jpe"    => "image/jpeg",
                "jpeg"    => "image/jpeg",
                "jpg"    => "image/jpeg",
                "js"    => "application/x-javascript",
                "kar"    => "audio/midi",
                "latex"    => "application/x-latex",
                "lha"    => "application/octet-stream",
                "log"    => "text/plain",
                "lzh"    => "application/octet-stream",
                "m3u"    => "audio/x-mpegurl",
                "man"    => "application/x-troff-man",
                "me"    => "application/x-troff-me",
                "mesh"    => "model/mesh",
                "mid"    => "audio/midi",
                "midi"    => "audio/midi",
                "mif"    => "application/vnd.mif",
                "mov"    => "video/quicktime",
                "movie"    => "video/x-sgi-movie",
                "mp2"    => "audio/mpeg",
                "mp3"    => "audio/mpeg",
                "mpe"    => "video/mpeg",
                "mpeg"    => "video/mpeg",
                "mpg"    => "video/mpeg",
                "mpga"    => "audio/mpeg",
                "ms"    => "application/x-troff-ms",
                "msh"    => "model/mesh",
                "mxu"    => "video/vnd.mpegurl",
                "nc"    => "application/x-netcdf",
                "oda"    => "application/oda",
                "patch"    => "text/diff",
                "pbm"    => "image/x-portable-bitmap",
                "pdb"    => "chemical/x-pdb",
                "pdf"    => "application/pdf",
                "pgm"    => "image/x-portable-graymap",
                "pgn"    => "application/x-chess-pgn",
                "pgp"    => "application/pgp",//added by skwashd
                "php"    => "application/x-httpd-php",
                "php3"    => "application/x-httpd-php3",
                "pl"    => "application/x-perl",
                "pm"    => "application/x-perl",
                "png"    => "image/png",
                "pnm"    => "image/x-portable-anymap",
                "po"    => "text/plain",
                "ppm"    => "image/x-portable-pixmap",
                "ppt"    => "application/vnd.ms-powerpoint",
                "ps"    => "application/postscript",
                "qt"    => "video/quicktime",
                "ra"    => "audio/x-realaudio",
                "rar"=>"application/octet-stream",
                "ram"    => "audio/x-pn-realaudio",
                "ras"    => "image/x-cmu-raster",
                "rgb"    => "image/x-rgb",
                "rm"    => "audio/x-pn-realaudio",
                "roff"    => "application/x-troff",
                "rpm"    => "audio/x-pn-realaudio-plugin",
                "rtf"    => "text/rtf",
                "rtx"    => "text/richtext",
                "sgm"    => "text/sgml",
                "sgml"    => "text/sgml",
                "sh"    => "application/x-sh",
                "shar"    => "application/x-shar",
                "shtml"    => "text/html",
                "silo"    => "model/mesh",
                "sit"    => "application/x-stuffit",
                "skd"    => "application/x-koan",
                "skm"    => "application/x-koan",
                "skp"    => "application/x-koan",
                "skt"    => "application/x-koan",
                "smi"    => "application/smil",
                "smil"    => "application/smil",
                "snd"    => "audio/basic",
                "so"    => "application/octet-stream",
                "spl"    => "application/x-futuresplash",
                "src"    => "application/x-wais-source",
                "stc"    => "application/vnd.sun.xml.calc.template",
                "std"    => "application/vnd.sun.xml.draw.template",
                "sti"    => "application/vnd.sun.xml.impress.template",
                "stw"    => "application/vnd.sun.xml.writer.template",
                "sv4cpio"    => "application/x-sv4cpio",
                "sv4crc"    => "application/x-sv4crc",
                "swf"    => "application/x-shockwave-flash",
                "sxc"    => "application/vnd.sun.xml.calc",
                "sxd"    => "application/vnd.sun.xml.draw",
                "sxg"    => "application/vnd.sun.xml.writer.global",
                "sxi"    => "application/vnd.sun.xml.impress",
                "sxm"    => "application/vnd.sun.xml.math",
                "sxw"    => "application/vnd.sun.xml.writer",
                "t"    => "application/x-troff",
                "tar"    => "application/x-tar",
                "tcl"    => "application/x-tcl",
                "tex"    => "application/x-tex",
                "texi"    => "application/x-texinfo",
                "texinfo"    => "application/x-texinfo",
                "tgz"    => "application/x-gtar",
                "tif"    => "image/tiff",
                "tiff"    => "image/tiff",
                "tr"    => "application/x-troff",
                "tsv"    => "text/tab-separated-values",
                "txt"    => "text/plain",
                "ustar"    => "application/x-ustar",
                "vbs"    => "text/plain", //added by skwashd - for obvious reasons
                "vcd"    => "application/x-cdlink",
                "vcf"    => "text/x-vcard",
                "vcs"    => "text/calendar",
                "vfb"    => "text/calendar",
                "vrml"    => "model/vrml",
                "vsd"    => "application/vnd.visio",
                "wav"    => "audio/x-wav",
                "wax"    => "audio/x-ms-wax",
                "wbmp"    => "image/vnd.wap.wbmp",
                "wbxml"    => "application/vnd.wap.wbxml",
                "wm"    => "video/x-ms-wm",
                "wma"    => "audio/x-ms-wma",
                "wmd"    => "application/x-ms-wmd",
                "wml"    => "text/vnd.wap.wml",
                "wmlc"    => "application/vnd.wap.wmlc",
                "wmls"    => "text/vnd.wap.wmlscript",
                "wmlsc"    => "application/vnd.wap.wmlscriptc",
                "wmv"    => "video/x-ms-wmv",
                "wmx"    => "video/x-ms-wmx",
                "wmz"    => "application/x-ms-wmz",
                "wrl"    => "model/vrml",
                "wvx"    => "video/x-ms-wvx",
                "xbm"    => "image/x-xbitmap",
                "xht"    => "application/xhtml+xml",
                "xhtml"    => "application/xhtml+xml",
                "xls"    => "application/vnd.ms-excel",
                "xlt"    => "application/vnd.ms-excel",
                "xml"    => "application/xml",
                "xpm"    => "image/x-xpixmap",
                "xsl"    => "text/xml",
                "xwd"    => "image/x-xwindowdump",
                "xyz"    => "chemical/x-xyz",
                "z"    => "application/x-compress",
                "zip"    => "application/zip",
       );
       $type = strtolower(substr(strrchr($filename, "."),1));
       if(isset($contentType[$type])) {
            $mime = $contentType[$type];
       }else {
               $mime = "application/octet-stream";
       }
       return $mime;
    }
}

if(!function_exists("image_type_to_extension"))
{
   function image_type_to_extension($imagetype)
   {
       if(empty($imagetype)) return false;
       switch($imagetype)
       {
           case IMAGETYPE_GIF    : return ".gif";
           case IMAGETYPE_JPEG    : return ".jpg";
           case IMAGETYPE_PNG    : return ".png";
           case IMAGETYPE_SWF    : return ".swf";
           case IMAGETYPE_PSD    : return ".psd";
           case IMAGETYPE_BMP    : return ".bmp";
           case IMAGETYPE_TIFF_II : return ".tiff";
           case IMAGETYPE_TIFF_MM : return ".tiff";
           case IMAGETYPE_JPC    : return ".jpc";
           case IMAGETYPE_JP2    : return ".jp2";
           case IMAGETYPE_JPX    : return ".jpf";
           case IMAGETYPE_JB2    : return ".jb2";
           case IMAGETYPE_SWC    : return ".swc";
           case IMAGETYPE_IFF    : return ".aiff";
           case IMAGETYPE_WBMP    : return ".wbmp";
           case IMAGETYPE_XBM    : return ".xbm";
           default                : return false;
       }
   }

}
function getRemoteUrl($remote,$local)
{
    Http::curl_download($remote, $local);
}
getRemoteUrl("http://jh-vw.com/skins/pince/images/pince.swf","./test.swf");
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。