2013-07-27 3 views
1

У меня есть код для загрузки архивных файлов:как получить доступ к файлу из вне корневого каталога в PHP

$dl_path = './'; 
$filename = 'favi.zip'; 
$file = $dl_path.$filename; 
if (file_exists($file)) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/zips');  
    header("Pragma: public");  
    header("Expires: 0");  
    header("Cache-Control:must-revalidate, post-check=0, pre-check=0"); 
    header("Content-Type:application/force-download");  
    header("Content-Type:application/download"); 
    header("Content-Disposition:attachment;filename=$filename ");  
    header("Content-Transfer-Encoding:binary "); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
} 

есть корневой каталог /public_html, скрипт выполняется в корневом каталоге.

Почтовый индекс: /.

Я пытаюсь использовать $dl_path как /, но он не работает.

Пожалуйста, помогите.

+1

1. правильно отформатируйте свой код; 2. используйте ../ как путь для перехода ниже public_html –

+1

3. Проверьте разрешения –

ответ

8
$dl_path = __DIR__.'/..'; // parent folder of this script 
$filename = 'favi.zip'; 
$file = $dl_path . DIRECTORY_SEPARATOR . $filename; 

// Does the file exist? 
if(!is_file($file)){ 
    header("{$_SERVER['SERVER_PROTOCOL']} 404 Not Found"); 
    header("Status: 404 Not Found"); 
    echo 'File not found!'; 
    die; 
} 

// Is it readable? 
if(!is_readable($file)){ 
    header("{$_SERVER['SERVER_PROTOCOL']} 403 Forbidden"); 
    header("Status: 403 Forbidden"); 
    echo 'File not accessible!'; 
    die; 
} 

// We are good to go! 
header('Content-Description: File Transfer'); 
header('Content-Type: application/zip'); 
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control:must-revalidate, post-check=0, pre-check=0"); 
header("Content-Type: application/force-download"); 
header("Content-Type: application/download"); 
header("Content-Disposition: attachment;filename={$filename}"); 
header("Content-Transfer-Encoding: binary "); 
header('Content-Length: ' . filesize($file)); 
while(ob_get_level()) ob_end_clean(); 
flush(); 
readfile($file); 
die; 

^попробуйте этот код. Посмотрите, работает ли это. Если это не так:

  • Если это 404, значит файл не найден.
  • Это значит, что вы не можете получить к нему доступ (разрешения).
+0

Да, это работает, спасибо. И небольшая вещь, загруженный файл сохраняется как «favi.zip» вместо favi.zip. как это изменить. – RJ501

+0

Исправлен заголовок («Content-Disposition: attachment; filename = {$ filename}»); 'теперь корректно работать. – CodeAngry

0

Прежде всего проверьте, работает ли ваш скрипт под правильным каталогом, эхом dirname(__FILE__).

Если он работает под public_html, то вы можете изменить код так:

$dl = dirname(__FILE__). '/../'; 

Но остерегайтесь проблема безопасности!

  1. Проверьте, если вы разрешения на чтение/записи на файл и каталога
  2. Проверьте open_basedir ограничения в php.ini (см How can I relax PHP's open_basedir restriction?)

Надеется, что это помогает

Смежные вопросы