Как считать загруженные документы - PullRequest
1 голос
/ 20 декабря 2011

Я работаю над сайтом, который позволяет посетителям загружать различные документы, используя этот код:

<input type="button" class="downloadedFile" value="Download File" onclick="window.location.href=\'documents/' . $docsRow['docFileName'] . '\'" />

$ docsRow ['docFileName'] - это путь к каждому документу, которыйизвлекается из базы данных MySQL.

В целом эти документы находятся в аккордеоне jQuery, причем каждая панель аккордеона является классом с одним или несколькими документами, например:

<div id="accordion">
<h3><a href="#">LEAD5220 - Leader as Change Agent</a></h3>
<div>
    <p class="className">Leader as Change Agent</p>
    <p class="classNumber">LEAD5220</p>
        <hr class="classSeparator" />
        <table width="95%">
            <tr>
                <td><strong>Document Name:</strong> Generic Annotation Format</td>
                <td width="100px" align="right"><input type="button" class="downloadedFile" value="Download File" onclick="window.location.href='documents/Generic Annotation Format.docx'" /></td>
            </tr>
            <tr>
                <td colspan="2"><strong>Description:</strong> This document can be used as a template for your annotations in the annotated bibliography forums.</td>
            </tr>
        </table>
        <hr class="classSeparator" />
        ...

Мой клиент хочет иметь возможность подсчитать, сколько раз каждый документ был загружен за класс .

Я знаю, что могу определить нажатие кнопки с помощью javascript, и насколько ""для каждого класса я могу использовать jQuery, чтобы определить, в какой таблице классов нажата кнопка, но я не понимаю, как это: 1) как получить эту информацию в код PHP / MySQL для записи в базу данных, и 2)может только определить нажатие кнопки или определить, действительно ли пользователь загрузил файл на свой компьютер (это файлы PDF, DOC, XLS).

Спасибо за помощь!

Ответы [ 3 ]

4 голосов
/ 20 декабря 2011

Существует 2 варианта подсчета количества скачиваний. Одним из них является ссылка на страницу php, которая записывает каждое попадание, а затем перенаправляет на фактический файл. Что-то вроде:

<?
$class = $_REQUEST['class'];
$doc = $_REQUEST['doc'];

// insert the code here to get and update the number of hits to this class/doc

// now redirect
header('Location: http://www.example.com/thefile.doc');
    ?>

В html ссылке может быть что-то вроде:

<a href="getfile.php?class=X&doc=Y">download file</a>

Второй подход, который я лично предпочитаю, - записывать количество попаданий с помощью ajax. Когда пользователь нажимает на ссылку для загрузки, сделайте что-то вроде:

$('a.thelink').click( function() {
    $.post ('getfile.php', { class: X, doc: Y });
});

таким образом вы отправляете данные для записи, и пользователь остается на той же странице.

Если вам нужно больше разъяснений, дайте мне знать.

3 голосов
/ 20 декабря 2011

Для второй части: Вы не знаете.Если пользователь запросил документ, он получил его.HTTP не имеет состояния, поэтому после щелчка вы можете только попытаться проверить, равна ли сумма, переданная пользователю, размеру документа ... Но на самом деле это невозможно.

Для первой части: не ссылатьсянепосредственно к документу, но вместо этого к странице PHP, которая считает загрузку, соблюдает параметр и перенаправляет на фактический документ.Или он может вернуть двоичное содержимое документа, как вам угодно.

0 голосов
/ 20 декабря 2011

Другим подходом является подача документа напрямую через php-документ, в котором записывается каждая загрузка.

Вы называете php-файл как document-counter.php?file=path/file.ext

, не забудьте urlencode($filename);

document-counter.php

<?php
if ( ! isset($_GET['file'])) {
    die ('_GET file not set');
}

$file = realpath($_SERVER['DOCUMENT_ROOT'] . urldecode($_GET['file']));
if ( ! file_exists($file)) {
    die($file . ' not exists');
}

$size = filesize($imageFile);
$extension = pathinfo ($imageFile, PATHINFO_EXTENSION);

header('HTTP/1.1 200 OK');
header('Pragma: no-cache');
// Attention: the following line can vary depending of the extension of the file !
header('Content-Type: application/' . $extension);
header('Content-Length: ' . $size);

// here, ***after the header***, goes all the stuff for incrementing the counters and
// saving them

readfile($imageFile);
...