我用的是
file_exists函數判斷檔案是否存在,可奇怪的是如果我只判斷
檔案的目錄是否存在返回true,只要一加上檔案名稱就返回false(檔案是確實存在的)求教這是為什嗎?
public function download($file_url){ if(!isset($file_url)||trim($file_url)==''){ echo '路徑不正確';exit; } $filename=$this->get_basename($file_url); $file_name = preg_replace("/(\s|\ \;| |\xc2\xa0)/","",$filename); //去掉檔案名稱中的空格。 $file_name = iconv("UTF-8","GB2312",urldecode($file_name)) ; //取檔案名稱,將urlcode編碼轉回來 $filename = str_replace( '+', '%20', urlencode($filename) ) ; //解決urlcode編碼空格問題。 //這一步 我把產生的$file 列印出來放在url裡斷行符號 直接下載 可是就是在判斷檔案是否存在哪裡一直不通過 $file = dirname(base_url($file_url)).'/'.$filename ; $file = fopen($file,"r"); if (!$file) { echo "檔案找不到"; } else { header("Content-type: application/octet-stream"); //header("Accept-Ranges: bytes"); //header("Accept-Length: ".filesize($file_url)); Header("Content-Disposition: attachment; filename=" . trim($file_name)); while (!feof ($file)) { echo fread($file,50000); } fclose ($file); } }
回複內容:
我用的是file_exists函數判斷檔案是否存在,可奇怪的是如果我只判斷檔案的目錄是否存在返回true,只要一加上檔案名稱就返回false(檔案是確實存在的)求教這是為什嗎?
public function download($file_url){ if(!isset($file_url)||trim($file_url)==''){ echo '路徑不正確';exit; } $filename=$this->get_basename($file_url); $file_name = preg_replace("/(\s|\ \;| |\xc2\xa0)/","",$filename); //去掉檔案名稱中的空格。 $file_name = iconv("UTF-8","GB2312",urldecode($file_name)) ; //取檔案名稱,將urlcode編碼轉回來 $filename = str_replace( '+', '%20', urlencode($filename) ) ; //解決urlcode編碼空格問題。 //這一步 我把產生的$file 列印出來放在url裡斷行符號 直接下載 可是就是在判斷檔案是否存在哪裡一直不通過 $file = dirname(base_url($file_url)).'/'.$filename ; $file = fopen($file,"r"); if (!$file) { echo "檔案找不到"; } else { header("Content-type: application/octet-stream"); //header("Accept-Ranges: bytes"); //header("Accept-Length: ".filesize($file_url)); Header("Content-Disposition: attachment; filename=" . trim($file_name)); while (!feof ($file)) { echo fread($file,50000); } fclose ($file); } }
可能是你的檔案夾或者檔案的許可權問題
應該是你用dirname()的時候返回的路徑問題,可以移除結果裡面最左邊的'/'
fopen要求檔案名稱就是實際的檔案名稱,而你的$filename變數是urlencode的值,所以打不開,卻可以下載