2010-02-24 42 views
6

Tôi có một trang lưu trữ tệp và người dùng kiếm được phần thưởng để tải xuống. Vì vậy, tôi muốn biết là có một cách tôi có thể theo dõi xem khách truy cập đã tải xuống toàn bộ tệp sao cho không có tải xuống một phần giả chỉ để nhận phần thưởng.Tệp theo dõi tải xuống hoàn chỉnh

Cảm ơn bạn.

+0

Các tệp đó có kích thước lớn như thế nào? Kb? Mb? <100 Mb? – Strae

+0

DK-Wamp đã nói "Tôi có thể có các chi tiết khác về chủ đề này không? // Tôi đã cố gắng sử dụng tập lệnh này nhưng không hoạt động đối với tôi. :(// Tôi biết đó là chủ đề cũ nhưng tôi hy vọng Tìm một giải pháp. " – Veedrac

Trả lời

1

Nếu bạn có thể theo dõi mã phản hồi HTTP được máy chủ web của bạn trả lại và buộc chúng trở lại phiên mà tạo chúng, bạn sẽ hoạt động.

Mã phản hồi của 206 cho thấy hệ thống đã gửi một số thông tin nhưng không phải tất cả thông tin đó. Khi đoạn cuối cùng của tệp xuất hiện, nó sẽ không có mã phản hồi là 206.

Nếu bạn có thể liên kết phiên này với phiên người dùng bằng cách đặt mã phiên trong URL, bạn có thể cung cấp điểm dựa trên đơn giản tổng hợp nhật ký.

+0

Bạn có thể cho tôi xem một số ví dụ về cách sử dụng của nó không? – Shishant

+0

Tôi không có bất kỳ nhật ký Apache nào tiện dụng. Bạn có xảy ra đoạn trích chuyển tệp từ nhật ký mà bạn có thể đăng không? Lọc theo một tệp và một địa chỉ IP để chỉ nhận các mục có liên quan. Tùy thuộc vào định dạng nhật ký của bạn, việc tìm mục nhập là trang cuối cùng của tệp sẽ tương đối dễ dàng. – TheJacobTaylor

1

Tôi đã triển khai giải pháp tương tự trên trang web lưu trữ tệp.

Điều bạn muốn làm là sử dụng cuộc gọi lại register_shutdown_function cho phép bạn phát hiện kết thúc thực thi tập lệnh php bất kể kết quả.

Sau đó, bạn muốn đặt tệp của mình ở vị trí không thể truy cập web trên máy chủ và tải xuống qua php: ý tưởng là bạn muốn có thể theo dõi số lượng byte đã được chuyển đến khách hàng.

Đây là một cách cơ bản thực hiện (ví dụ :)

<?php 
register_shutdown_function('shutdown', $args); 

$file_name = 'file.ext'; 
$path_to_file = '/path/to/file'; 
$stat = @stat($path_to_file); 

//Set headers 
header('Content-Type: application/octet-stream'); 
header('Content-Length: '.$stat['size']); 
header('Connection: close'); 
header('Content-disposition: attachment; filename='.$file_name); 

//Get pointer to file 
$fp = fopen('/path/to/file', 'rb'); 
fpassthru($fp); 

function shutdown() { 
    $status = connection_status(); 

    //A connection status of 0 indicates no premature end of script 
    if($status == 0){ 
    //Do whatever to increment the counter for the file. 
    } 
} 
>? 

Rõ ràng là có cách để cải thiện, vì vậy nếu bạn cần biết thêm chi tiết hoặc hành vi khác, xin vui lòng cho tôi biết!

+1

Điều này sẽ giết apache với các tập tin lớn ... – Strae

+0

Vâng, bạn đã đúng, nó phụ thuộc rất nhiều vào việc sử dụng của trang web. Trên ứng dụng của chúng tôi, chúng tôi sử dụng để tải tất cả các tệp xuống qua php bởi vì chúng tôi đã từng xác thực Điểm số là chúng tôi đã có các máy chủ chuyên dụng để phục vụ các tập tin đó, cho ăn các máy chủ lưu trữ phụ trợ chạy lighttpd Chúng tôi đã giảm bớt dấu chân của Apache bằng cách biên dịch và vô hiệu hoá tất cả trừ các mô-đun cần thiết. khoảng 130 lượt tải xuống/máy chủ đồng thời trên 35 giao diện người dùng, cho tổng số thông lượng là 2 .3Gbps ... –

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