2012-11-19 15 views
5

가상 포인트 용 파일을 구입할 수있는 웹 사이트를 만들고 있습니다. 사용자가 구매하지 않고 파일을 다운로드 할 수있게하고 싶지 않아 숨길 필요가 있습니다. 모든 파일을 호스트가 아닌 다른 사람의 허락없이 폴더에 넣습니다. 문제는 누군가가 파일을 구입하여 다운로드하려고하는 경우입니다.PHP로 안전한 파일 다운로드, 허락없이 사용자 거부

나는 파일 getter를 만들기로 결정했다. 그것은 사용자의 권한을 확인한 다음 파일 내용을 출력 할 것이다. 지금까지 내 코드 : 사용자가이 작업을 수행 할 수있는 권한이 이제 임 확인

<?php 
    require_once('content/requirements.php'); //mysql connections 
    secure(1); //disconnect unlogged users 

    if (!isset($_GET['id'])) //if no file id provided 
     die(); 

    $fid=mysql_real_escape_string($_GET['id']); //file id 

    $query="SELECT * FROM files WHERE user_id = "$_SESSION['user_id']." AND file_id = ".$id; 

    $q=mysql_query($query); 

    if (mysql_num_rows($q)!=1) //if no permission for file or multipe files returned 
     die(); 

    $file=mysql_fetch_array($q); //file id 
    $sub=mysql_fetch_array(mysql_query("SELECT * FROM sub WHERE id = ".$file['file_id'])); //payment id 
?> 

, phpScript이 파일의 내용을 작성하고 사용자가 다운로드 할 수 appropiate 헤더를 보내야합니다.

파일을 바이트 단위로 읽고 인쇄하는 방법과 파일을 다운로드 할 수있게하기 위해 헤더()에 무엇을 써야합니까 (내용을 복사 할 필요가 없도록).

어쩌면 이것이 최선의 방법은 아니지만 잠시 생각한 것 중에 가장 좋은 방법이었을 것입니다.

고맙습니다.

+0

readfile php doc에서. 이것에 대한 수백만 가지 설명이 있습니다. – arkascha

+1

그곳에있는 동안 'SQL injection'에 대한 인터넷 검색을 시도해보십시오. – symcbean

답변

9

사용 구글

if (file_exists($file)) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($file)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
} 
+0

가장 간단하고 작동 :) 감사합니다! –

5

은 다음, 구글에 많은 스크립트를 사용할 수 몇 가지 링크가 있습니다

http://www.tutorialchip.com/php-download-file-script

http://www.webinfopedia.com/php-file-download-script.html

+1

칩의 튜토리얼을 구현했는데, 그것은 매력과 같습니다. 고마워요 – IberoMedia

+1

안녕하세요, 손상된 zip 파일을 받고 있었는데 따기와 pocking 후 솔루션을 알아 냈습니다. ob_clean() [ref.outcontrol] : 다시, tutorialchip 클래스에서, 공지 사항이
오류 "로 zip 파일을 방지하기 위해 언젠가 ob_clean 전에 ob_start()를 추가합니다. 버퍼를 삭제하는 데 실패 없음 버퍼가 삭제할하기 /일부/그리드/서버 ... 라인 413
" – IberoMedia

+0

@IberoMediaim은 잘못된 파일 반응을 얻고 ... 도와 .. –