Download Counter Language Table of Contents
 Japanese [日本語]  
 English [英語]  
 Korean [韓国語]  
 Simplified Chinese [简体中文]  
 Traditional Chinese [繁體中文]  
 Español [スペイン語]  
 Français [フランス語]  
 Português [ポルトガル語]  
  Arabic العربية [アラビア語]  
 Deutsch [ドイツ語]  
 Italiano [イタリア語]  
 Russian [ロシア語]  
 Turkish [トルコ語]  
 Hindi [ヒンディー語]  
 Vietnamese [ベトナム語]  
 Thai [タイ語]  
 Dutch [オランダ語]  
 Indonesian [インドネシア語]  
 Malay [マレー語]  
 Filipino [フィリピン語]  
 Swedish [スウェーデン語]  
 Norwegian [ノルウェー語]  
 Danish [デンマーク語]  
 Finnish [フィンランド語]  
 Polish [ポーランド語]  
 Czech [チェコ語]  
 Hungarian [ハンガリー語]  
 Greek [ギリシャ語]  
 Romanian [ルーマニア語]  

Contador de Descargas
Download History Viewing Program
= Descargar e Instalar Código PHP =
Sample Download Counter

Introducción:

Esta es una introducción a un programa que permite conocer el número de descargas cuando un usuario de una página web descarga y utiliza un programa. Es posible configurar un contador de descargas en la página y los administradores del sitio también pueden consultar fácilmente el historial de descargas en el navegador.

[Ejemplo Instalado en la Página]
Descargas totales: 1865 [Hoy: 23 Ayer: 76]
[Ejemplo Abierto en el Navegador]

Nota: Si una página con un enlace de descarga muestra un mensaje que sugiere guardar el archivo y se cierra sin iniciar la descarga, aún se contará como una descarga. Esto se debe a que cuenta el número de clics en el enlace.

Instrucciones de Descarga:

Desde esta página, descarga el archivo comprimido "zip" del programa e instálalo en tu propio sitio. El archivo se llama "count.php", pero puedes cambiarlo.

Eres libre de usar y modificar el código, incluyendo cambiar el diseño de la página.

Modifica el código para agregar nuevas funciones o cambiar el diseño y así crear una página que sea fácil de entender y utilizar.

 Descarga del Programa PHP:
Instrucciones de Instalación:

Descomprime el archivo descargado "count.php.zip" y se creará un archivo llamado "count.php". Por favor, crea un directorio como "download_history" y guárdalo allí.

El archivo "zip" contiene solo un archivo, "count.php", y la "pantalla de inicio de sesión" para el administrador se genera automáticamente.

Configuración:

Este es el método principal de configuración. Estas partes principales también se enumeran en el archivo PHP.

  1. Configuración de Archivos para Descargar:
    1. Es necesario establecer una contraseña para la página del administrador.
    2. La contraseña predeterminada es "admin", pero cámbiala a cualquier cadena de tu elección.
    3. Para aumentar la seguridad, establece una contraseña fuerte.
  2. SConfiguración de Archivos para Descargar:
    1. Completa la configuración para "$targetFiles = array()".
    2. Esta es la parte como "'1' => 'Tu URL/nombre del archivo.zip',".
  3. Directorio para Guardar Archivos de Registro:
    1. e requiere un directorio llamado "log" en el servidor remoto para almacenar archivos de registro que registren la historia.
    2. Este programa crea automáticamente un directorio llamado "log" cuando cargas por primera vez. Sin embargo, si recibes un mensaje como "No hay directorio", créalo y cárgalo por separado.
  4. Visualización del Historial de Subidas por Primera Vez:
    1. Cuando se realiza una carga por primera vez, en el historial puede aparecer la "fecha" y el número "0".
    2. Esto se debe a que se generan archivos de registro como "count_1.log" que contienen la fecha de carga en el directorio "log" generado automáticamente.
    3. Si esto te molesta, descarga un archivo como "count_1.log" desde el servidor remoto, elimina los datos y cárgalo.
    4. Sin embargo, el estado de "fecha" y "0" también puede ser un historial de cuándo se inició el contador. Si hay una descarga en ese día, se contará.
  5. Visualización de Página del Administrador:
    1. Cuando los administradores ven la página, pueden elegir si mostrar la URL o solo el nombre del archivo.
    2. Si se colocan varias tablas de historial en una página, puedes elegir mantenerlas en el orden establecido por "$targetFiles = array()" o ordenarlas según la fecha en que se generaron nuevos registros.
  6. Diseño de Página, CSS, etc.:
    1. Ajusta el diseño de la página, el CSS, etc., según sea necesario para que la página sea fácil de leer.
    2. En algún momento, el CSS se escribía como un archivo externo, pero ahora se escribe en la misma página para que puedas hacer referencia a las etiquetas al cambiar el CSS.
  7. Configuración del Enlace de Descarga en la Página:
    1. Típicamente, la etiqueta de descarga <a> se escribe de la siguiente manera:
      <a href="/download_history/sample.zip" download="File name when downloading.zip"> [Cadena arbitraria]</a>
    2. En este programa, escribe la etiqueta de descarga <a> de la siguiente manera:
    3. [Ejemplo]Copiar
      <a href="/download_history/count.php?download=1" download="File name when downloading.zip" target="_blank">[Cadena arbitraria]</a>
    4. Haz coincidir el número en "download=1" con el número establecido en "$targetFiles = array()". Esta configuración se refiere a los archivos que se descargarán.
    5. Haz coincidir la ruta con tu página.
    6. Carga la página con el enlace de descarga después de cargar el archivo con "$targetFiles = array()" (en este ejemplo, "count.php").
  8. Código para Mostrar el Historial en una Línea:
    1. Crea el siguiente JavaScript y colócalo en la página donde quieras mostrarlo:
    2. [Ejemplo]Copiar
      <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
    3. Haz coincidir el número en "dsp_count=1" con el número establecido en "$targetFiles = array()".
    4. Si eliminas "&day_dsp=on," se mostrará solo el "número total" sin la visualización de "hoy/ayer".
    5. Descargas totales: 1865 [Hoy: 23 Ayer: 76]
      Descargas totales: 1865
    6. Haz coincidir la ruta con tu página.
Acerca de la configuración de la extensión

Cuando se muestran varias tablas, la configuración predeterminada de este programa es ordenar por la hora de la última actualización. Si desea ordenar por el total de descargas, cree un nuevo archivo como "total_downloads.php" y reemplace la siguiente parte.

  1. Cambios en los comentarios
    Reemplace los comentarios en la siguiente sección:
    // Elegir si reemplazar la matriz original con una nueva ordenada según el orden de los nuevos registros al mostrar múltiples tablas en una página
  2. Copie el comentario a reemplazar
    // Si se muestran varias tablas en la página, seleccione/establezca si desea reemplazar la matriz original y ordenar en orden descendente del número total de descargas.
  3. Cambios en el código y los comentarios
    Reemplace el código y los comentarios en la siguiente sección. Considérelo como un solo bloque.
    // Obtener rutas de archivos y sus fechas de última actualización (ordenadas en orden descendente de fecha)
    $filePathsAndDates = array();
    foreach ($filePath as $key => $path) {
        if (file_exists($path)) {
            $filePathsAndDates[$key] = filemtime($path);
        } else {
            // Imprimir este error en el registro y decidir si continuar o abortar el procesamiento
            echo "Error: El archivo no existe - $path<br>";
        }
    }
    
    // Ordenar en orden descendente por la última fecha de actualización (la fecha más reciente va primero)
    arsort($filePathsAndDates);
    
    // Reconstruir la matriz de rutas de archivos ordenados
    $sortedFilePaths = array();
    foreach ($filePathsAndDates as $key => $date) {
        $sortedFilePaths[$key] = $filePath[$key];
    }
  4. Copie el código de reemplazo y los comentarios.
    // Matriz que almacena el número total de descargas
    $totalDownloads = array();
    
    // Obtener la ruta del archivo y su número total de descargas
    foreach ($filePath as $key => $path) {
        if (file_exists($path)) {
            $line = file($path);
            $total = 0;
    
            // Agrega el número de descargas para cada fila
            foreach ($line as $val) {
                $valArray = explode(',', $val);
                $total += trim($valArray[1]);
            }
    
            // Almacena el número total de descargas en una matriz
            $totalDownloads[$key] = $total;
        } else {
            // Enviar este error al registro y decidir si continuar o cancelar el proceso
            echo "Error: el archivo no existe - $path<br>";
        }
    }
    
    // Ordenar por número total de descargas en orden descendente
    arsort($totalDownloads);
    
    // Reconstruir la matriz ordenada de rutas de archivos
    $sortedFilePaths = array();
    foreach ($totalDownloads as $key => $total) {
        $sortedFilePaths[$key] = $filePath[$key];
    }
  5. Creación y configuración de archivos
    1. Cuando se crean múltiples páginas, para evitar errores en la configuración de elementos al agregar contenido de manera uniforme, cree la siguiente parte del código como un archivo externo y cárguelo en la parte implementada actualmente con un código diferente. Cree un archivo externo con un nombre como "config.php".
    // Configuración de archivos para descargar. Si hay varios archivos, agrégales '2', '3', '4', etc. También, '0' es válido.
    // Usa "http:" o "https:" para el protocolo.
    $targetFiles = array(
        '1' => 'TuURL/NombreArchivo.zip',
        '2' => 'TuURL/NombreArchivo.pdf',
        '3' => 'TuURL/NombreArchivo.pdf',
        '4' => 'TuURL/NombreArchivo.pdf',
    );
  6. Copie la muestra de la parte a nombrar "config.php"
    <!doctype html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>DownloadHistory</title>
    <meta name="robots" content="NOINDEX,NOFOLLOW">
    </head>
    <body>
    <?php
    // Convierte sólo esta parte en un archivo externo y cárgalo en la página que usas con "include __DIR__ . '/config.php';"
    // Configuración de archivos para descargar. Si hay varios archivos, agrégales '2', '3', '4', etc. También, '0' es válido.
    // Usa "http:" o "https:" para el protocolo.
    $targetFiles = array(
        '1' => 'TuURL/NombreArchivo.zip',
        '2' => 'TuURL/NombreArchivo.pdf',
        '3' => 'TuURL/NombreArchivo.pdf',
        '4' => 'TuURL/NombreArchivo.pdf',
    );
    ?>
    </body>
    </html>
    
  7. Código y ubicación para cargar archivos externos.
    1. Incluya el archivo creado con un nombre como "config.php" en la siguiente ubicación con el código "include __DIR__ . '/config.php';".
    2. Comente o elimine la siguiente sección y reemplácela con el código "include __DIR__ . '/config.php';".
    //$targetFiles = array(
    //    '1' => 'TuURL/NombreArchivo.zip',
    //    '2' => 'TuURL/NombreArchivo.pdf',
    //    '3' => 'TuURL/NombreArchivo.pdf',
    //    '4' => 'TuURL/NombreArchivo.pdf',
    //);
  8. Copie el código a reemplazar
    include __DIR__ . '/config.php';
* La "font-family" en el programa debe ajustarse para coincidir con su propio sitio si es necesario.
《 Código PHP para Crear el Contador de Descargas 》
Guarda el archivo con la extensión ".php"..

<?php
//***************************************************************************************************
// Contador de Descargas y Visor de Historial de Descargas - Programa en PHP
// [Libro Un Poco Útil de Conocimientos de Todos]
// [みんなの知識 ちょっと便利帳]
// https://www.benricho.org/Tips/download_history/
// Publicado: 28 de enero de 2024
//
// Descripción general:
// Este programa es un sistema para rastrear la historia de descargas de archivos, equipado con funcionalidad de autenticación de usuarios.
// Incluye características como saneamiento de datos de entrada, creación de archivos de registro y visualización de estadísticas de descargas.
// Puedes usarlo libremente, incluyendo la modificación del código y el cambio del diseño de la página.
//
// Nota:
// Antes de cargar la página que contiene los enlaces de descarga, asegúrate de configurar la sección "$targetFiles = array()" de este archivo,
// y carga esta página antes que la página con los enlaces de descarga.
// No hacerlo puede resultar en que los usuarios no puedan descargar al intentarlo, ya que esta página establece y referencia los archivos a descargar.
//
// Configuración y Notas:
// ① La contraseña está establecida como "admin", pero cámbiala a cualquier cadena deseada.
// ② El directorio "log" para almacenar archivos de registro se genera automáticamente en la primera carga.
// Sin embargo, si encuentras mensajes como "directorio no encontrado", cárgalo por separado.
// ③ En la carga inicial, la pantalla de historial muestra "fecha" y el número "0".
// Esto se debe a que se generan simultáneamente archivos de registro como "count_1.log" con la fecha de carga en el directorio "log" creado automáticamente.
// Si esto es un problema, accede al servidor remoto, descarga archivos como "count_1.log", borra los datos y luego carga.
// ④ Al mostrar múltiples tablas en una página en la pantalla de historial, puedes elegir si mantener el conjunto de arrays en [$targetFiles = array] o mostrarlos en orden cronológico.
// ⑤ En la pantalla de historial, puedes elegir si incluir el dominio en 1) mostrar el archivo o 2) mostrar solo el nombre del archivo.
//
// [Formato del Enlace en la Página con Enlaces de Descarga]
// [Ejemplo] <a href="/download_history/count.php?download=Número Registrado" download="NombreArchivoDescargado.zip">[Cualquier Cadena]</a>
// ① Ajusta el número en "download=1" al número establecido en "$targetFiles = array()".
// ② Ajusta la ruta para que coincida con tu página.
//
// [Código (JavaScript) para mostrar el historial en una línea en la página donde está el enlace de descarga]
// [Ejemplo] <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
// ① Ajusta el número en "dsp_count=1" al número establecido en "$targetFiles = array()".
// ② Si eliminas "&day_dsp=on", se mostrará solo el "total" sin "hoy" y "ayer".
// ③ Ajusta la ruta para que coincida con tu página.
//***************************************************************************************************

// Configuración de archivos para descargar. Si hay varios archivos, agrégales '2', '3', '4', etc. También, '0' es válido.
// Usa "http:" o "https:" para el protocolo.
$targetFiles = array(
    '1' => 'TuURL/NombreArchivo.zip',
    '2' => 'TuURL/NombreArchivo.pdf',
    '3' => 'TuURL/NombreArchivo.pdf',
    '4' => 'TuURL/NombreArchivo.pdf',
);

// Establecer la codificación de caracteres para la salida HTML
header("Content-Type: text/html; charset=utf-8");

// Codificación de caracteres en la página que muestra el historial de descargas
// Establecer a 'SJIS' para Shift-JIS, 'EUC-JP' para EUC-JP
$encodingType = 'UTF-8';

// Definir información de autenticación de usuario y otras configuraciones
$userid = 'admin';   // ID de usuario (reemplazar 'admin' con cualquier cadena)
$password = 'admin'; // Contraseña (reemplazar 'admin' con cualquier cadena)
$hashedPassword = password_hash($password, PASSWORD_DEFAULT); // Utilizar password_hash() para generar un valor hash
$dataLogDir = 'log/'; // El directorio 'log' se genera automáticamente por este programa. Si no se crea, carga un directorio llamado 'log' por separado

// Elegir si incluir o no el dominio al mostrar el nombre del archivo
$includeDomain = 1;  // 1: Mostrar incluyendo el nombre de dominio, 0: Mostrar solo el nombre del archivo

// Elegir si reemplazar la matriz original con una nueva ordenada según el orden de los nuevos registros al mostrar múltiples tablas en una página
$sortTables = 1;  // 1: Ordenar, 0: No ordenar

$dir = 'log'; // Directorio para almacenar archivos de registro e historial de descargas

// Obtener el dominio de tu sitio
$domain = $_SERVER['HTTP_HOST'];

// Gestión de sesiones: Prevenir el secuestro de sesiones y usar session_set_cookie_params()
session_set_cookie_params(0, '/', $domain, true, true); // Establecer banderas HttpOnly y Secure
session_start();
if (!isset($_SESSION['auth'])) {
    $_SESSION['auth'] = FALSE;
}

// Hashing de contraseñas: Utilizar password_needs_rehash()
if (password_needs_rehash($hashedPassword, PASSWORD_DEFAULT)) {
    $newHashedPassword = password_hash($password, PASSWORD_DEFAULT);
    // Guardar el nuevo valor hash en una base de datos, etc.
}

// Crear el directorio si no existe
if (!is_dir($dir)) {
    if (mkdir($dir, 0755, true)) {
    } else {
        // Mostrar si falla la creación del directorio
        echo 'Por favor, crea el directorio "' . $dataLogDir . '" y cárgalo por separado.';
    }
}

// Verificar si el directorio de registros es escribible
if (!is_writable($dataLogDir)) {
    die('El directorio "' . $dataLogDir . '" no existe o no tiene permisos de escritura. Por favor, crea el directorio y establece los permisos adecuadamente (por ejemplo, 755).');
}

// Obtener la fecha base y la fecha de ayer
$baseDay = date("Y/m/d");
$yesterday = date("Y/m/d", strtotime("-1 day"));

// Función para obtener el día de la semana a partir de una fecha
function getDayOfWeek($date)
{
    $dayOfWeek = date('w', strtotime($date));
    $weekDays = array('Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb');
    return $weekDays[$dayOfWeek];
}

// Establecer la ruta del archivo para cada archivo objetivo y crear un archivo de registro si no existe
foreach ($targetFiles as $key => $val) {
    $filePath[$key] = $dataLogDir . "count_" . $key . ".log";

    // Crear el archivo de registro si no existe
    if (!file_exists($filePath[$key])) {
        createLogFile($filePath[$key]);
    }
}

// Obtener rutas de archivos y sus fechas de última actualización (ordenadas en orden descendente de fecha)
$filePathsAndDates = array();
foreach ($filePath as $key => $path) {
    if (file_exists($path)) {
        $filePathsAndDates[$key] = filemtime($path);
    } else {
        // Imprimir este error en el registro y decidir si continuar o abortar el procesamiento
        echo "Error: El archivo no existe - $path<br>";
    }
}

// Ordenar en orden descendente por la última fecha de actualización (la fecha más reciente va primero)
arsort($filePathsAndDates);

// Reconstruir la matriz de rutas de archivos ordenados
$sortedFilePaths = array();
foreach ($filePathsAndDates as $key => $date) {
    $sortedFilePaths[$key] = $filePath[$key];
}

// Elegir condicionalmente si usar las rutas ordenadas para la clasificación
$filePath = ($sortTables) ? $sortedFilePaths : $filePath;

// Devolver código JavaScript al cliente (mostrar dinámicamente los recuentos de descargas)
if (isset($_GET['dsp_count'])) {
    header("Content-type: application/x-javascript");

    // Establecer el encabezado como un archivo JavaScript
    if (!preg_match("/^[0-9]+$/", $_GET['dsp_count'])) {
        echo "document.write(\"El parámetro debe ser un número de ancho medio\")";
        exit();
    }

    $dspCountNo = $_GET['dsp_count'];
    if (!file_exists($filePath[$dspCountNo])) {
        createLogFile($filePath[$dspCountNo]);
    }

    $line = file($filePath[$dspCountNo]);
    $total = 0;
    $todayCount = 0;
    $yesterdayCount = 0;

    foreach ($line as $val) {
        $valArray = explode(',', $val);
        $total += trim($valArray[1]);
        if (strpos($valArray[0], $baseDay) !== false) {
            $todayCount = trim($valArray[1]);
        }
        if (strpos($valArray[0], $yesterday) !== false) {
            $yesterdayCount = trim($valArray[1]);
        }
    }

    // Si la opción de visualización de fecha está ACTIVADA, mostrar incluyendo la fecha
    if (isset($_GET['day_dsp']) && $_GET['day_dsp'] == 'on') {
        $countDsp = <<<EOF
document.write('<div class="counter_inpage">Descargas totales: <strong>{$total}</strong>[<span class="count_today">Hoy : <strong>{$todayCount}</strong></span>  <span class="count_yesterday">Ayer : <strong>{$yesterdayCount}</strong></span>]</div>')
EOF;
    } else {
        // Si la opción de visualización de fecha está DESACTIVADA, mostrar solo el recuento total de descargas
        $countDsp = <<<EOF
document.write('<p class="counter_inpage">Descargas totales: {$total}</p>')
EOF;
    }

    // Si la codificación de caracteres no es UTF-8, convertir
    if ($encodingType != 'UTF-8') $countDsp = mb_convert_encoding($countDsp, "$encodingType", 'UTF-8');
    echo $countDsp;

    exit();
}

// Procesamiento cuando se solicita la descarga de un archivo
if (isset($_GET['download'])) {
    $fileId = $_GET['download'];

    // Salir si el ID de archivo no es un número o si el ID de archivo no existe
    if (!preg_match("/^[0-9]+$/", $fileId) || !isset($filePath[$fileId])) {
        exit('Parámetro numérico incorrecto');
    }

    // Abrir el archivo y bloquearlo
    $fp = fopen($filePath[$fileId], "rb+");
    if (!$fp) {
        exit('No se pudo abrir el archivo');
    }

    flock($fp, LOCK_EX);

    // Leer el archivo de registro y almacenarlo en un array
    $line = array();
    while (($data = fgets($fp)) !== false) {
        $line[] = $data;
    }

    // Truncar el archivo y agregar una nueva línea de fecha al principio
    ftruncate($fp, 0);
    rewind($fp);

    // Agregar una nueva línea de fecha al principio si no existe
    if (strpos($line[0], $baseDay) === false) {
        $writeLine = $baseDay . ',1' . "\n";
        fwrite($fp, $writeLine);
    }

    // Procesar cada línea en el archivo
    foreach ($line as $val) {
        // Incrementar el conteo de descargas para la fecha actual
        if (strpos($val, $baseDay) !== false) {
            $valArray = explode(',', $val);
            $valArray[1] = rtrim($valArray[1], "\n") + 1;
            $val = $valArray[0] . ',' . $valArray[1] . "\n";
        }
        fwrite($fp, $val);
    }

    // Limpiar el búfer y liberar el bloqueo
    fflush($fp);
    flock($fp, LOCK_UN);

    // Cerrar el archivo
    fclose($fp);

    // Limpiar el búfer de salida
    ob_end_clean();

    // Realizar la descarga del archivo
    header("Location: {$targetFiles[$fileId]}");
    exit();
} else {
    // Iniciar la sesión, destruir la sesión si se solicita cerrar sesión
    session_start();
    if (isset($_GET['logout'])) {
        $_SESSION = array();
        session_destroy();
    }

    $loginError = '';

    if (!isset($_SESSION['auth'])) {
        $_SESSION['auth'] = FALSE;
    }

    // Utilizar la función de hash de contraseña para generar un valor hash
    // Procesamiento de inicio de sesión
    if (isset($_POST['userid']) && isset($_POST['password'])) {
        // Comparar valores hash para la autenticación
        if ($_POST['userid'] === $userid && password_verify($_POST['password'], $hashedPassword)) {
            $oldSid = session_id();
            session_regenerate_id(TRUE);

            if (version_compare(PHP_VERSION, '5.1.0', '<')) {
                $path = session_save_path() != '' ? session_save_path() : '/tmp';
                $oldSessionFile = $path . '/sess_' . $oldSid;

                if (file_exists($oldSessionFile)) {
                    unlink($oldSessionFile);
                }
            }

            $_SESSION['auth'] = TRUE;
        } else {
            // Procesamiento para falla de autenticación
            $_SESSION['auth'] = FALSE;
            $loginError = '<div style="text-align: center; color: crimson;">ID de usuario o contraseña incorrectos.</div>';
        }
    }

  // Si la autenticación no tiene éxito, muestra la pantalla de inicio de sesión
  if ($_SESSION['auth'] !== TRUE) {
      ?>
      <!DOCTYPE html>
      <html lang="es">
      <head>
          <meta charset="utf-8">
          <meta name="robots" content="NOINDEX,NOFOLLOW">
          <title>Pantalla de Inicio de Sesión del Historial de Descargas</title>
          <!-- Estilos de la pantalla de inicio de sesión (modificables según sea necesario)-->
          <style>
              body {
                  font-family: Arial, sans-serif;
                  background-color: #f4f4f4;
                  margin: 0px;
                  padding: 0px;
                  display: flex;
                  align-items: center;
                  justify-content: center;
                  height: 100vh;
              }
              form {
                  background-color: #fff;
                  padding: 20px;
                  border-radius: 8px;
                  box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);
              }
              label {
                  display: block;
                  margin-bottom: 8px;
              }
              input {
                  font-size: 18px; 
                  width: 100%;
                  padding: 8px;
                  margin-bottom: 16px;
                  box-sizing: border-box;
              }
              button {
                  font-size: 16px;
                  background-color: #4caf50;
                  color: #fff;
                  padding: 10px;
                  border: none;
                  border-radius: 4px;
                  cursor: pointer;
              }
              .logintitle {
                  text-align: center;
                  font-size: 18px;
                  font-weight: bold;
              }
              .logininfo {
                  text-align: center;
              }
              .passwordshow {
                  font-size: 14px;
                  font-weight: bold;
                  color: darkgray;
                  text-align: center;
              }
              .center-container {
                  display: inline-block;
                  margin: 0 5px 0 0;
              }
          </style>
      </head>
      <body>
          <div id="login_form">
              <form action="<?php echo $fileName; ?>?mode=download" method="post">
                  <p class="logintitle">【Ver Historial de Descargas】</p>
                  <?php if (isset($loginError)): ?>
                      <!-- Muestra un mensaje de error si la variable $loginError está definida -->
                      <p style="color: crimson;"><?php echo $loginError; ?></p>
                  <?php endif; ?>
                  <label for="userid">ID de Usuario:</label>
                  <input type="text" id="userid" name="userid" required>
                  <label for="password">Contraseña:</label>
                  <input type="password" id="password" name="password" required>
                  <?php
                      // Suponiendo que $showPassword es una variable PHP que determina si mostrar inicialmente la contraseña
                      echo '<label class="passwordshow" for="showPassword">[Mostrar Contraseña]<div class="center-container"><input type="checkbox" id="showPassword" onchange="togglePasswordVisibility()" ' . ($showPassword ? 'checked' : '') . '></div></label>';
                  ?>
                  <button type="submit" name="login_submit">Iniciar Sesión</button>
              </form>   
          </div>

  <!-- Controla la visibilidad de la contraseña -->
  <script>
    function togglePasswordVisibility() {
      var passwordInput = document.getElementById('password');
      var showPasswordCheckbox = document.getElementById('showPassword');

      if (showPasswordCheckbox.checked) {
        // Si está marcado, se mostrará la contraseña
        passwordInput.type = 'text';
      } else {
        // Desmarcar para ocultar la contraseña
        passwordInput.type = 'password';
      }
    }
  </script>
  </body>
  </html><?php
  exit();
  } else {
      // Si está autenticado, muestra la página de historial de descargas
      ?>
      <!DOCTYPE html>
      <html lang="es">
      <head>
        <meta charset="utf-8">
        <meta name="robots" content="NOINDEX,NOFOLLOW">
        <title>Historial de Descargas</title>
        <!-- Estilo de visualización del historial de descargas (modificable según sea necesario) -->
        <style>
                 body {
                     font-family: 'Hiragino Kaku Gothic ProN', 'Hiragino Kaku Gothic ProN W3', Meiryo, Osaka, 'MS PGothic', arial, helvetica, sans-serif;
                 }
                 .log_title {
                     font-size: 16px;
                     font-weight: bold;
                     color: brown;
                     margin: 0px 0px 15px 10px;
                 }
                 .get_url {
                     font-size: 13px;
                     font-weight: bold;
                     padding: 8px 0;
                     color: brown;
                     background-color: lightgoldenrodyellow;
                 }
                 .log_table{
                     float:left;
                     width: 300px;
                     border: #CCC 1px solid;
                     border-radius: 5px;
                     margin: 0px 0px 5px 10px;
                     padding: 0px 5px 5px 5px;
                     word-break: break-all;
                 }
                 table {
                     width: 100%;
                     border-collapse: collapse;
                 }
                 td,
                 th {
                     padding: 5px 10px;
                     border: 1px solid #999;
                     text-align: right;
                     font-size: 90%;
                 }
                 th {
                     background: lavenderblush;
                     text-align: center;
                     font-weight: normal;
                 }
                 .tableheader {
                     background: lavender;
                     text-align: center;
                     font-weight: bold;
                     white-space: nowrap;
                 }
                 .total{
                     float:left;
                     margin: -25px 0px 0px 10px;
                 }
                 .counter_inpage{
                     margin: 15px 0px 8px 0px;
                 }
                 .bold{
                     font-weight: bold;
                 }
             </style>
      </head>
      <body>
        <div class="log_title">【Historial de Descargas】 【<a href="?logout=true">Cerrar Sesión</a>】</div> 
        <?php foreach($filePath as $key => $val){ ?>                      
          <div class="log_table">         
            <div class="get_url"><?php echo $includeDomain ? $targetFiles[$key] : basename($targetFiles[$key]); ?></div>
            <table align="center">
              <tr>
                <th class="tableheader">Fecha</th>
                <th class="tableheader">Descargas</th>
              </tr>
              <?php	  
                $totalDownload = 0;

                // Leer solo si el archivo existe
                if (file_exists($val)) {
                  $line = file($val);
                  foreach ($line as $lineVal) {
                    $lineArray = explode(',', $lineVal);

                    // Verificar si $lineArray[1] es un valor numérico
                    $valorNumerico = filter_var($lineArray[1], FILTER_VALIDATE_FLOAT);
                    if ($valorNumerico !== false) {
                      $totalDownload += $valorNumerico;
                      ?>
                      <tr>
                        <th nowrap><?php echo $lineArray[0] . ' (' . getDayOfWeek($lineArray[0]) . ')'; ?></th>
                        <td class="bold" nowrap><?php echo $lineArray[1]; ?></td>
                      </tr>
                      <?php
                    }
                  }
                }
              ?>
              <tr>
                <th colspan="2" class="bold">Total: <?php echo $totalDownload;?></th>
              </tr>
            </table>
          </div>              
        <?php
                    }
                  }
                }
              ?>
      </body>
      </html><?php
      // Función para sanear todos los elementos de un array
      function sanitize($arr)
      {
        // Si es un array, aplicar la sanidad de forma recursiva
        if (is_array($arr)) {
          return array_map('sanitize', $arr);
        }
        // Eliminar caracteres NULL de dentro de las cadenas
        return str_replace("\0", "", $arr);
      }

      // Crear un nuevo archivo de registro si no existe
      function createLogFile($filePath)
      {
        $baseDay = date("Y/m/d");
        $fp = fopen($filePath, "a+b");

        if ($fp) {
          flock($fp, LOCK_EX);
          ftruncate($fp, 0);
          rewind($fp);
          fwrite($fp, "$baseDay,0");
          fflush($fp);
          flock($fp, LOCK_UN);
          fclose($fp);

          // Establecer permisos de archivo
          chmod($filePath, 0666);
        } else {
        }
      }
Guarda el archivo con la extensión ".php".
Esto concluye la introducción al código PHP para el "Contador de Descargas/Programa de Visualización de Historial de Descargas". Esperamos que te sea útil.

Puede haber errores en la redacción ya que es una traducción desde la versión japonesa. Pedimos disculpas por las molestias, pero si hay errores en la redacción del código, por favor, corrígelos o ajústalos tú mismo.

Agradecemos tus comentarios sobre el uso de este código. Ten en cuenta que no puedo responder preguntas.

おすすめサイト・関連サイト…

Last updated : 2024/06/29