2017-12-10 21 views
2

タスクは、ファイルダウンロード数をカウントするコントローラを作成することです。また、失敗したダウンロードやキャンセルされたダウンロードを考慮に入れる必要があります。私は誰もがこれを達成するための最善の方法を知っていたのだろうかと思っていた。ファイルが実際に何回ダウンロードされたかを知るにはどうすればよいですか?

その後
$file = $_GET['download']; 
if (ob_get_level()) { 
    ob_end_clean(); 
} 
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)); 
return filesize($file);` 

    $size = filesize($file); 

与えられたバイト数は、ファイルサイズとほぼ等しい場合:

if ($size < given bytes) { 
    $handle = fopen("counter.txt", "r"); 
    while (!feof($handle)) { 
     $buffer = fgets($handle, 4096); 
     $buffer=$buffer+1; 
    } 
    fclose($handle); 
    $fp = fopen("counter.txt", "w"); 
    $test = fwrite($fp, $buffer); 
    fclose($fp); 
} 

リンクをクリックした後、ユーザーにサーバーから送信されたバイト数を知るには?

答えて

1

私はコメントがどうあるべきかから始めましょう:

  • あなたはジャバスクリプトとしてこれをタグ付けしましたが、あなたのquesiotnではJavaScriptとは何の関係もないように見えます。お願い、それはやめて。

  • 私はあなたのスクリプトによって公開されているかすかなセキュリティホール/あなたがそれを気にしていないことに気付いていると思います。

  • あなたの出力バッファリングの取り扱いが間違っています。

リターンファイルサイズ($ファイル);

  • このコード行はどのようなものですか?

header( 'Expires:0');

ヘッダ( 'プラグマ:パブリック')。

  • また、あなたの質問に関しては

- そのすべてin the manualをカバー:

<?php 
ignore_user_abort(1); 

$file = $_GET['download']; 
if (!is_readable($file)) { 
    die "No such 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('Cache-Control: max-age=0; must-revalidate'); 
header('Content-Length: ' . filesize($file)); 

$count=0; 
$ih=fopen($file, 'r'); 
while (CONNECTION_NORMAL==connection_status() && !feof($ih)) { 
    print fgets($ih, 4096); 
} 
log_completion(feof($ih)); 

はところで:ファイルがダウンロードされた場合、これは正確な記録を与えるものではありません - コンテンツは、PHPの土地を残している場合にのみ伝えることができます。

+0

ProTip:コードを8スペースでインデントしてリストに入れます(通常の4文字の代わりに) –

関連する問題