2012-11-19 40 views
5

Tôi đang tạo trang web nơi bạn có thể mua tệp cho các điểm ảo và sau đó tải xuống chúng. Tôi không muốn cho phép người dùng tải xuống các tệp mà không mua nó, vì vậy tôi phải ẩn chúng. Tôi đặt tất cả các tập tin trong một thư mục mà không có sự cho phép cho bất cứ ai ngoại trừ máy chủ, vấn đề là khi ai đó mua một tập tin và muốn tải nó xuống.Tải xuống tệp an toàn bằng PHP, từ chối người dùng mà không được phép

Tôi quyết định tạo một tệp getter, sẽ kiểm tra quyền của người dùng và sau đó in ra nội dung tệp. Mã của tôi cho đến nay:

<?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 
?> 

Bây giờ khi Im chắc chắn người dùng sẽ được ủy quyền để làm điều này, PHPScript nên viết nội dung tập tin và gửi cho thích hợp tiêu đề để cho phép người dùng tải về nó.

Cách đọc tệp byte-byte và in và tôi nên viết gì trong tiêu đề() để làm cho tệp có thể tải xuống (vì vậy bạn không phải sao chép nội dung của tệp).

Có lẽ đây không phải là cách tốt nhất để làm điều này, nhưng đó là điều tốt nhất tôi nghĩ đến trong một thời gian.

Thanx để được trợ giúp.

+0

Sử dụng google. Có hàng triệu lời giải thích về điều này. – arkascha

+1

Hãy thử googling cho 'SQL injection' trong khi bạn đang ở đó. – symcbean

Trả lời

9

từ readfile php doc

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

Đơn giản nhất và hoạt động :) Cảm ơn bạn! –

5

Có rất nhiều kịch bản có sẵn trên google, Dưới đây là vài liên kết:

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

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

+1

Tôi đã thực hiện hướng dẫn của chip và nó hoạt động giống như sự quyến rũ. Cảm ơn bạn – IberoMedia

+1

Xin chào, tôi đã nhận được tệp zip bị hỏng và sau khi chọn và đổ, tôi đã tìm ra giải pháp. Một lần nữa, từ lớp tutorialchip, thêm ob_start() đôi khi trước ob_clean để ngăn tệp zip có lỗi "
Thông báo: ob_clean() [ref.outcontrol]: không thể xóa bộ đệm. Không có bộ đệm để xóa trong /some/grid/máy chủ ... trên dòng
" – IberoMedia

+0

@IberoMediaim nhận được chỉ đáp ứng tập tin không hợp lệ ... giúp .. –

Các vấn đề liên quan