1. 程式人生 > >php檔案下載中file_exists報檔案不存在,實際檔案存在

php檔案下載中file_exists報檔案不存在,實際檔案存在

開發環境:windows系統,PHP5.6,nginx1.8
用ThinkPHP開發,發現在PHP檔案中用file_exists報false,但打印出檔案路徑是可以訪問的,查了下百度發現很多都說許可權問題,在linux上可能存在,但是在windows是沒有的。如下程式碼:可直接拿來用,寫好的方法

方法1:用file_exists判斷相對路徑的檔案是否存在

/**
     * 檔案下載
     */
    public function fileDownload(){
        $file_id=I('id');//檔案ID
        $file_model=I('model');//檔案所在資料表
        if(empty($file_model) || empty($file_id)){
            $this->error('檔案資料不全!!');
        }
        $file_info=D("{$file_model}")->where(array('id'=>$file_id))->find();
        $filename = $file_info['file_name'] ;//檔名包含副檔名
        $file_path = '.'.C('TMPL_PARSE_STRING')['__UPLOADS__'].$file_info['file_url'];
//        要用相對路徑
        if(!file_exists($file_path)){
            $this->error('檔案不存在!!!');
        }
        $fp=fopen($file_path,"r");
        $file_size=filesize($file_path);
        //下載檔案需要用到的header
        Header("Content-type: application/octet-stream");
        Header("Accept-Ranges: bytes");
        Header("Accept-Length:".$file_size);
        Header("Content-Disposition: attachment; filename=".$filename);
        $buffer=1024;
        $file_count=0;
        //向瀏覽器返回資料
        while(!feof($fp) && $file_count<$file_size){
            $file_con=fread($fp,$buffer);
            $file_count+=$buffer;
            echo $file_con;
        }
        fclose($fp);

    }

方法2:用完整的路徑判斷是否存在

/**
 * 檢查檔案是否存在
 * @param $file_http_path       檔案完整路徑 帶http或者https
 * @return bool
 */
public function check_exists($file_http_path){
    // 遠端檔案
    if(strtolower(substr($file_http_path, 0, 4))=='http'){

        $header = get_headers($file_http_path, true);

        return isset($header[0]) && (strpos($header[0], '200') || strpos($header[0], '304'));
        // 本地檔案
    }else{
        return file_exists('.'.$file_http_path);
    }
}