php檔案下載中file_exists報檔案不存在,實際檔案存在
阿新 • • 發佈:2019-01-04
開發環境: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); } }