2012-06-25 5 views
0
나는 거의 verbatum, 유일한 차이점은 내가 보호하고 파일이 public_html을 폴더 위 내 사용자 폴더에 있습니다 ( PHP to protect PDF and DOC)에서 마틴 바커의 코드/응답을 사용하고

PHP 보호 된 파일 액세스

폴더 구조

/users/websupport 
/public_html 

/users/websupport/FileToDownload.pdf 

download.php 파일이

에 있습니다 : 다운로드

파일에 있습니다

/public_html/download.php 

하지만 Firefox는 download.php에서 파일을 찾을 수 없을 때 파일을 찾을 수 없다고 알려줍니다.

나는 파일이 ftp를 통해 존재 함을 확인했다.

웹 루트 외부에 파일을 배치하면 .htaccess 사이트에 뭔가를 추가해야합니까? 내가이 문제로 어디로 가고 있는지 확실하지 않습니다. 아래는 download.php의 코드입니다.

//check users is loged in and valid for download if not redirect them out 
// YOU NEED TO ADD CODE HERE FOR THAT CHECK 
// array of support file types for download script and there mimetype 
$mimeTypes = array(
    'doc' => 'application/msword', 
    'pdf' => 'application/pdf', 
); 
// set the file here (best of using a $_GET[]) 
$file = "../users/websupport/2011cv.pdf"; 

// gets the extension of the file to be loaded for searching array above 
$ext = explode('.', $file); 
$ext = end($ext); 

// gets the file name to send to the browser to force download of file 
$fileName = explode("/", $file); 
$fileName = end($fileName); 

// opens the file for reading and sends headers to browser 
$fp = fopen($file,"r") ; 
header("Content-Type: ".$mimeTypes[$ext]); 
header('Content-Disposition: attachment; filename="'.$fileName.'"'); 

// reads file and send the raw code to browser 
while (! feof($fp)) { 
    $buff = fread($fp,4096); 
    echo $buff; 
} 
// closes file after whe have finished reading it 
fclose($fp); 
+2

어떻게 액세스하고 있습니까? – Blaster

+0

나는 firefox가 download.php를 찾을 수 없다, 너는 너의 URL을 다시 쓰고 있니? – jeroen

+0

Hi Jeroen - 아니요, URL을 다시 쓰지 않습니다. –

답변

0

PHP 스크립트가 실행되는 사용자에게 해당 디렉토리에 대한 읽기 권한이 있는지 확인하십시오.

대부분의 debian 유도체에서 아파치에 임베드 된 php에서 사용자는 'www-data'가됩니다.

+0

CP 액세스 (남아 프리카 공화국의 Hetzner)를 사용하는 공유 호스팅 환경이므로 분명히 CHMOD가 가능할지라도 사용자를 변경할 수 있는지 확실하지 않습니다. –

+0

jailed shell이나 비슷한 shell 접근이 가능한지 공유 호스트에 물어봐야합니다. 또한 공유 호스팅 환경에서 suexec 및 'suPHP'등으로 인해 사용자 자신의 사용자로 실행되는 경우가 많으므로 chmod를해야합니다. – AndrewPK

0

최근에 readfile() 및 fpassthru()가 내 서버에서 작동하지 않는 문제가있었습니다.

나는 결국 파일에 대한 심볼릭 링크를 만들어 필요한 파일에 전달했습니다. 심볼릭 링크를 만드는 방법을 배울 수 있습니다 here. 그런 다음 전체 경로가 '폴더'서버에서 사는 곳이 될 것 'http://somesite.com/folder/fake_file.pdf'와 같은 링크를 가지고 사용자를 원한다면

나는

exec("ln -s source_file_full_path full_path_to_fake_file");

을 사용하면 'fake_file 포함됩니다. pdf '를 가짜 파일 경로에 추가하십시오.

링크가 만료되었습니다. x 분보다 오래된 작성 날짜가있는 모든 symlink를 찾도록 다른 호출을했습니다. this answer에서 어떻게하는지 볼 수 있습니다. (시간이 지나면 기한이 만료 될 수 있습니다.)