• php文件下载IE文件名乱码问题


    一直用chrome浏览器,没发现问题。今天用ie6,发现文件下载时文件名乱码,ie下迅雷下载文件名也是乱码。网上查了下说在ie下需要使用urlencode编码一下,我试了下

    header('Content-Disposition: attachment; filename='. rawurlencode($file_name);

    结果用ie下载还是乱码。php文件本身是gbk/gb2312编码,于是我先将$file_name转换成utf-8编码再进行urlencode

    header('Content-Disposition: attachment; filename='. rawurlencode(iconv("GBK","UTF-8",$file_name)));

    这样使用ie下载就没问题了,难道urlencode只能对utf-8进行转义编码?

    还有就是获取远程文件的大小问题,php中的filesize函数只能对本地文件进行处理,处理远程文件会失败并发出一条警告,并且在windows平台传入的参数必须是gbk/gb2312编码,使用utf-8编码将无法访问系统中的资源。

    在网上找了四种获取远程文件大小的方法,多谢前辈们的分享,记录一下:

    方法一:header

    <?php 
    get_headers($url,true); 
     
    //返回结果 
    Array 
    ( 
        [0] => HTTP/1.1 200 OK 
        [Date] => Sat, 29 May 2004 12:28:14 GMT 
        [Server] => Apache/1.3.27 (Unix)  (Red-Hat/Linux) 
        [Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT 
        [ETag] => "3f80f-1b6-3e1cb03b" 
        [Accept-Ranges] => bytes 
        [Content-Length] => 438 
        [Connection] => close 
        [Content-Type] => text/html 
    ) 
    ?> 

    这里可以根据Content-Length直接获取大小了。

    方法二:curl

    function remote_filesize($uri,$user='',$pw='') 
    { 
        // start output buffering 
        ob_start(); 
        // initialize curl with given uri 
        $ch = curl_init($uri); 
        // make sure we get the header 
        curl_setopt($ch, CURLOPT_HEADER, 1); 
        // make it a http HEAD request 
        curl_setopt($ch, CURLOPT_NOBODY, 1); 
        // if auth is needed, do it here 
        if (!emptyempty($user) && !emptyempty($pw)) 
        { 
            $headers = array('Authorization: Basic ' . base64_encode($user.':'.$pw)); 
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
        } 
        $okay = curl_exec($ch); 
        curl_close($ch); 
        // get the output buffer 
        $head = ob_get_contents(); 
        // clean the output buffer and return to previous 
        // buffer settings 
        ob_end_clean(); 
     
        echo '<br>head-->'.$head.'<----end <br>'; 
     
        // gets you the numeric value from the Content-Length 
        // field in the http header 
        $regex = '/Content-Length:\s([0-9].+?)\s/'; 
        $count = preg_match($regex, $head, $matches); 
     
        // if there was a Content-Length field, its value 
        // will now be in $matches[1] 
        if (isset($matches[1])) 
        { 
            $size = $matches[1]; 
        } 
        else 
        { 
            $size = 'unknown'; 
        } 
        //$last=round($size/(1024*1024),3); 
        //return $last.' MB'; 
        return $size; 
    } 
    

    方法三:fsock

    function getFileSize($url) 
    { 
        $url = parse_url($url); 
        if($fp = @fsockopen($url['host'],emptyempty($url['port'])?80:$url['port'],$error)) 
        { 
            fputs($fp,"GET ".(emptyempty($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; 
                } 
                elseif(preg_match('/Content-Length:(.*)/si',$tmp,$arr)) 
                { 
                    return trim($arr[1]); 
                } 
            } 
            return null; 
        } 
        else 
        { 
            return null; 
        } 
    }
    

    方法四:file_get_contents

    $fCont = file_get_contents("http://www.cnmiss.cn/"); 
    echo strlen($fCont)/1024; 
  • 相关阅读:
    linux系统scp和rsync同步命令介绍
    linux系统发现系统变慢
    linux系统centos6和centos7开机流程及定时任务语法
    elasticsearch for windows
    elasticsearch for linux
    Python操作elasticsearch
    elasticsearch之快速上手
    elasticsearch简介
    flask中使用celery
    GoJS
  • 原文地址:https://www.cnblogs.com/jdluojing/p/3212452.html
Copyright © 2020-2023  润新知