Gestor de carpeta descargas

Codigo ya esta en Repositorio Activo :

https://github.com/AlfonsoOrozcoAguilarnoNDA/vibeCodingGestorCarpetaDescargas

Esta semana me salió una necesidad particular. Ese es el contexto.

El stack lo definimos primero, luego el caso de uso real, definimos las tablas de datos y por último generamos el prompt.

Stack :

Lenguaje siempre PHP 8.x procedural, MariaDB INNODB, Bootstrap 4.6.x y Font Awesome, debe ser provisto vía jsDelivr. No usar <?= sino <?php y, en la medida de lo posible, los echo deben empezar con " y no con '. Se asume que hay un config.php que ya tiene mysqli_connection establecido en la variable $link. Usarse dentro de las funciones si lo necesitas como global $link.

Reglas Generales:

Otra regla: debe identificarse el modelo en una barra de navegación. Debe ir barra de navegación fija con un enlace a Google, una opción dropdown con tres valores genéricos, y un footer fijo.

Caso de uso

Tenemos una persona que se mueve de muchas computadoras a otras. A veces la mejor manera de salvar la información es compactar todo en descargas/downloads en un ZIP y subirlo a un sitio. Queremos hacer un script que permita, después de pedir una contraseña hardcoded, guardar los archivos en base de datos si son menores a 3 MB configurables. Se pide comentario de cada archivo y se guarda la hora del archivo y la hora en que se guardó, así como su MIME type.

Si está duplicado no debe subirse, y no lo hace automático, sino que debe poner una descripción del archivo del directorio con color verde el botón si no existe el SHA1, en amarillo si ya existe, y en rojo si pasa del tamaño especificado.

El comportamiento esperado es que si se da clic al botón verde nos pregunte primero, lo inserte en una tabla, verifique el SHA1 del blob contra el del archivo y lo borre automáticamente, recargue la página. Con amarillo y rojo solo una opción de abrir en target="_blank" en el botón. Debe tener la opción de borrar en esos dos, pero debe confirmar en un modal de manera clara: “¿Está usted seguro?” y solo entonces borrar y pedir la contraseña Harecoded. Si es incorrecta no borrar, dar aviso y decir operación cancelada, password incorrecto.

Extra: Las imágenes van en una tabla llamada downloads_galeria, y los que no sean imágenes, en otra llamada downloads_documentos. Antes de ingresar el archivo en casos verdes debe haber oportunidad de pedir una categoría escribir un comentario y un checkbox de “Estoy seguro que quiero ingresar a base de datos”.

Nosotros no queremos que se asuma que el archivo se llama X. Debe reaccionar al nombre real del archivo, no asumir que es galeria.php. Incluir la fecha de hoy en el código, licencia MIT e identificarse como modelo en el código como coautor y en la cabcerade menues bootstrap. Es muy importante  ser un solo archivo.

Que Verifique primero si tiene poder de escritura y que ignore al agregar el archivo index.php si este existe. No asumir el nombre, sino que tome el nombre del archivo en curso.

Si quieres usa cards pero no esobligatorio. Al mostrar la galería esperamos una fila de 4 y al dar click el modal, y debe poderse hacer un filtro por categoría y al mostrar la imagen en un modal, mostrar en el modal: categoría, archivo, tamaño, fecha de subida, categoría (si no hay n/a) y comentario. Todo esto siempre en estándar UTF8MB4. Usar un no cache al principio del archivo único.

En modo autenticado deben poder cambiarse la bandera de SI/NO dando un click a un botón que cambie de estado al otro. La galería solo muestra los que tienen visible = SI y que en tipo documento sea Imagen. Considera un tercer tab para ver la lista de documentos, con una opción de filtrado por tamaño. Normalmente van siempre los más recientes primero.

Estructura definitiva para MariaDB (InnoDB) con codificación UTF-8 MB4.

Estructura de Datos Final (Versión de Producción)

SQL

-- 1. Tabla para Imágenes (Galería)
CREATE TABLE IF NOT EXISTS `downloads_galeria` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `nombre_archivo` VARCHAR(255) NOT NULL,
    `mime_type` VARCHAR(100) NOT NULL,
    `contenido` LONGBLOB NOT NULL,          -- Soporta hasta 4GB (usaremos el límite de 3MB)
    `sha1` CHAR(40) NOT NULL,               -- Hash de integridad
    `size_bytes` INT NOT NULL,              -- Tamaño en bytes
    `comentario` TEXT NULL,
    `tipo_archivo` VARCHAR(50) NULL Default 'Imagen',
    `categoria` VARCHAR(30) NULL,           -- Para el filtro dinámico
    `visible` VARCHAR(3) DEFAULT 'SI',      -- Control de visualización en galería
    `engine_ia` VARCHAR(30) NULL,           -- Campo de auditoría (se ignora en inserción)
    `fecha_archivo` DATETIME NOT NULL,      -- Fecha de creación/modificación original (mtime)
    `fecha_registro` DATETIME NOT NULL,     -- Fecha y hora exacta de la subida a DB
    INDEX (`sha1`),
    INDEX (`categoria`),
    INDEX (`visible`),
    INDEX (`fecha_registro`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 2. Tabla para Otros Documentos (Documentación)
CREATE TABLE IF NOT EXISTS `downloads_documentos` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `nombre_archivo` VARCHAR(255) NOT NULL,
    `mime_type` VARCHAR(100) NOT NULL,
    `contenido` LONGBLOB NOT NULL,
    `sha1` CHAR(40) NOT NULL,
    `size_bytes` INT NOT NULL,
    `comentario` TEXT NULL,
    `tipo_archivo` VARCHAR(50) NULL Default 'Documento',
    `categoria` VARCHAR(30) NULL,
    `visible` VARCHAR(3) DEFAULT 'SI',
    `engine_ia` VARCHAR(30) NULL,
    `fecha_archivo` DATETIME NOT NULL,
    `fecha_registro` DATETIME NOT NULL,
    INDEX (`sha1`),
    INDEX (`categoria`),
    INDEX (`visible`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


Inicia Prompt

PROMPT : GESTOR DE CARPETA DE

DOWNLOADS (ESPECIFICACIÓN V4)

Contexto: Eres un Desarrollador Senior experto en arquitectura PHP robusta.  El objetivo es un script de auditoría y migración de archivos locales a base de datos.

1. REGLAS DE IDENTIDAD Y CUMPLIMIENTO (Obligatorio)

  • Fecha:  25 de marzo de 2026 (hoy).

  • Licencia: MIT.

  • Coautoría: Debes identificarte en el encabezado con tu nombre de modelo y versión.

  • Archivo Único: Todo (PHP, CSS, JS) en un solo archivo php, tu defines el nombre

  • Control de Caché: El script debe iniciar con cabeceras PHP header para NO CACHE (Expires, Cache-Control, Pragma).

  • Codificación: Todo el sistema, conexión y salida debe ser estrictamente UTF-8 MB4.

2. STACK TECNOLÓGICO Y ESTILO

  • Backend: PHP 8.x Procedural. Prohibido <?=, usar <?php echo.

  • Strings: Los echo deben abrirse con comillas dobles ".

  • DB: MariaDB InnoDB. Existe config.php con $link (mysqli). Úsala como global $link.

  • Frontend: Bootstrap 4.6 y Font Awesome 5.x vía jsDelivr. Navbar y Footer fijos.

  • Un solo archivo. va una contraseña  Hardcoded que se debe usar para validar operaciones.
  • En caso de duda usar POST en lugar de get.

3. ESTRUCTURA DE DATOS Y PERMISO ESCRITURA

Al inicio del script, debes asegurar que las tablas galeria_downloads y documentos_downloads existan.

  • Asegurar que el motor sea InnoDB y el cotejamiento utf8mb4_unicode_ci.

  • Debe verificar  permiso de escritura en la carepta downloads y que esta exista.

Si algo no es asi dar aviso.

4. LÓGICA DINÁMICA DE ARCHIVOS (Downloads)

  • Escaneo: Usar scandir() en ./downloads/. NO ASUMIR NOMBRES, detectar el nombre real de cada archivo en el bucle. Avisasi no existe la carpeta.

  • Exclusiones: Ignorar index.php, archivos ocultos (.) y el propio script (basename(__FILE__)).

  • Seguridad: Verificar is_writable('./downloads/'). Si falla, mostrar alert-danger.

5. MÓDULO ADMINISTRATIVO (?module=agregar)

Protegido por contraseña hardcoded en sesión. Ponla en el Código fuente.

  • Lógica de Colores:

    • VERDE: (SHA1 no existe en DB Y tamaño < 3MB). Mostrar nombre, textarea (comentario), input (categoría) y checkbox (confirmación).

    • Procesamiento: Insertar en BLOB, validar SHA1 del BLOB insertado vs archivo original. Si es idéntico, ejecutar unlink() del archivo físico y recargar.

    • AMARILLO / ROJO: Botón _blank para ver y botón “Borrar” con Modal de confirmación.

  • El Modulo de ?module=manage debe llevar a ver al tabde ver la lista de documentos, y pedir laclave hardcoded.

6. MÓDULO GALERÍA Y UX (Público)

  • Vista: Mostrar solo galeria_downloads (16 por página, orden DESC).

  • Filtro: Incluir un selector (Dropdown o similar) para filtrar por el campo categoria. El filtrado debe ser funcional (vía POST). Se ordena por fecha de agregado, el mas reciente primero.

  • Interacción (Modal): Al hacer clic en una Card de imagen, abrir un Modal de Bootstrap que muestre:

    • Imagen completa.

    • Categoría, nombre original, tamaño (KB), fecha de subida y comentario.

7. INTERFAZ

  • Navbar: [Nombre del Modelo] | [Link Google] | [Dropdown 3 opciones] | [Links: Galería / Agregar / Salir].

  • Footer: Información de autoría y fecha fija abajo.

Considera que debe ser un solo archivo y cumplir lo mayor posible del caso de uso.

FIN PROMPT

Resultados :

Cohere

  • Suele dar buenos resultadospero fallo en archivo unico ypuso esta ordem Invalida
  • DELETE FROM downloads_galeria WHERE sha1 = ? OR DELETE FROM downloads_documentos WHERE sha1 =
    
  • A reserva que tenga un gráfico muy bueno descalificado

Deepseek:

  • La contraseña hardcoded 'Harecoded' — Parece un error tipográfico de “Hardcoded”, no es una contraseña real funcional. Y peor: la expone en JavaScript (if (password === '<?php echo CONTRASENA_ADMIN; ?>')) — cualquiera que inspeccione el código fuente del navegador la ve en texto plano.
  • La galería requiere login — El spec dice que la galería es pública. DeepSeek pone toda la app detrás de autenticación.
  • Base 64 muy pesado.

Grok:

  • <?= prohibido — el spec lo dice explícitamente. Grok lo usa en docenas de lugares.
  • jQuery desde code.jquery.com, no jsDelivr — igual que DeepSeek, ignoran el mismo requisito.
  • Modal de borrado sin verificar contraseña — el botón “Sí, borrar” en el modal simplemente hace POST sin pedir la clave hardcoded. El spec lo requiere explícitamente.
  • Módulo manage sin autenticación propia — solo checa $is_logged que ya viene de sesión, pero si alguien llega directo a ?module=manage sin haber hecho login, simplemente no ve nada en lugar de pedir clave.
  • Base 64 muy pesado.

Mistral :

  • Hace file_get_contents() del archivo físico en disco, no del BLOB en base de datos. Esto significa que si ya migró el archivo (y lo borró con unlink()), la galería simplemente falla en silencio o muestra imágenes rotas. Es un bug de lógica fundamental que rompe el caso de uso principal.
  • headers() dentro del <head> después del DOCTYPE — PHP ya habrá enviado output antes de los headers, causando “headers already sent”. Los cuatro modelos lo pusieron al inicio, este es el único que lo pone tarde.
  • stmt->send_long_data(2, $contenido) duplicado — está llamando bind_param con $contenido Y también send_long_data con el mismo contenido. Eso envía el BLOB dos veces, corrompiendo potencialmente la inserción.
  • UNION en sha1Exists() — usa UNION ALL con dos COUNT, lo que devuelve dos filas. Funciona porque suma ambos, pero es una query inusual que podría confundir.
  • La galería usa file_get_contents del disco , no del campo contenido de la BD.
  • Sin licencia MIT en el encabezado
  • jQuery slim — la versión slim excluye AJAX, lo cual puede causar problemas con algunos plugins de Bootstrap.

Stepfun

Dio basura completa en el chat imposible de copiar y pegar. Descalificado

Minimax

Truncado  Descalificado pero con ideas buenas.

Gemini :

  • Base64 inline duplicado (card + data-full para modal) ✓ confirmado
  • SELECT * trayendo LONGBLOB completo en el loop ✓ confirmado
  • Font Awesome desde cdnjs.cloudflare.com, no jsDelivr ✓ confirmado

Copilot :

Copilot entregó básicamente un wireframe — la estructura visual está pero el backend está vacío. Es el peor resultado funcional después de Stepfun.

  • No procesa ningún POST — tiene formularios para insertar y borrar, pero no hay ni una línea de PHP que maneje $_POST['archivo'], $_POST['confirmar'], ni la inserción en DB. Los formularios simplemente no hacen nada. Es una UI sin backend.
  • Modal de borrar genérico sin contexto — el botón “Borrar” de todos los archivos apunta al mismo #confirmModal, pero el modal no sabe qué archivo borrar. No hay data-file, no hay campo hidden, no hay lógica. Es decorativo.
  • Sin sesión — no hay session_start() en ninguna parte. El módulo agregar pide contraseña en cada formulario individual en lugar de autenticar una vez.
  • Sin módulos galería/documentos/agregar — el navbar tiene links a ?module=galeria, ?module=agregar, ?module=documentos pero no hay ningún if ($module === ...) en el código. Todos esos links llevan a la misma pantalla.
Meta.ai

Normalmente no lo uso pero me dio curiosidad .

  • Lo que Meta AI hizo MUY bien — mejor que casi todos:
    • Endpoint ?action=view_file&id=X&table=galeria — ¡Correcto! Sirve el BLOB con headers apropiados sin base64 inline. Solo Claude y Meta AI lo resolvieron correctamente de ese modo.
    • SHA1 verificado con SHA1(contenido) en la query — usa la función de MariaDB directamente, elegante.
    • Toggle de visibilidad vía AJAX — el único que usó AJAX para esto, sin recargar página.
    • Paginación con prev/next más robusta que los demás

Problemas:

  • Simula config.php en lugar de hacer require_once — deja credenciales hardcoded visibles
  • Font Awesome desde cdnjs, no jsDelivr — mismo error recurrente
  • jQuery slim — sin AJAX completo, pero lo usa para AJAX igualmente, contradicción
  • bind_param con "sssbisssss" — el tipo b para BLOB con bind normal no funciona correctamente, debería usar send_long_data
  • Módulo documentos requiere autenticación — la galería es pública pero documentos no, inconsistente con el spec
 Qwen:
  • mysqli_stmt_fetch(mysqli_stmt_get_result($check_g)) — uso incorrecto, mysqli_stmt_fetch no acepta un result set, es un bug real
  • Lógica de colores invertida — verifica amarillo ANTES que rojo, así que un archivo duplicado Y grande aparece amarillo en lugar de rojo
  • Paginación sin total — “Anterior/Siguiente” sin saber cuántas páginas hay, el botón Siguiente siempre aparece aunque no haya más imágenes

De los importantes solo  no lo apliqué a CHatgpt por razones que expliqué antes.

Pensé en pedirlle Claude que  mejore el uso del blob poque eso lo hizo mejor el y meta.ai que los demas. Pero al final Claude no mostraba nada así que lo dejé tal cual

Observaciones ya ejecutando :

Copilot:

  • No hace nada. CERO , Siguecon nivel de Becario

Mistral

  • No hace nada aunque su botón de Google se ve bonito 1

Cohere:

Se ve  muy ordenado el código pero Por primera vez me decepciona.  Cero

  • Su agregar no seve la imagen
  • No se ve galeria de lo ya subido
  • error en downloads_dir, no lo llama con global, nunca lo encuentra
  • El css está al final

Grok: Tiene 7

  • Le falta función function mime_content_type() asi que agrego una creada por gemini hace un tiempo.
  • Su opción de agragarse ve muy elegante pero no Muestra elcontenido de los archivos
  • La galeria no funciona

qwen Cero

  • Galeria no funciona
  • Le falta función function mime_content_type() asi que agrego una creada por gemini hace un tiempo.
  • Dos errores  por bind.
  • mysqli_stmt_get_result() devuelve un mysqli_result pero mysqli_stmt_fetch() espera un mysqli_stmt. Son dos funciones de APIs distintas que no se mezclan — es como usar el volante de un coche para conducir una bicicleta.

    El fix correcto sería:

    php
    $result_g = mysqli_stmt_get_result($check_g);
    $exists_g = mysqli_num_rows($result_g) > 0;
    

Qwen

  • No hace nada pero tiene detalles muy buenosde Interfaz. Dos

Meta.AI UNO

  • Hace cosas parecidas a grok en la interface
  • Simula config.php aunque config.php exista
  • No hace nada.
  • Es el mas grande de todos los modelos. Incluso mas que claude.

Claude 6

  • No encuentra los archivos en download asi que no puede agregar
  • Tiene una opcion de borrar en documentos y muyfuncional
  • Pero al ver un pdf trata de verlo online y no se ve
  • Buena presentacion graficacon salir, agregar.. documentos y galeria
  • Galeria no encuentra lo ya existente de la base.

Gemini 9

  • El unico que funciona
  • Le falta función function mime_content_type() asi que agrego una creada por gemini hace un tiempo.
  • Le faltan las cosas Graficas de otros.
  • La iteración dos para corregir cosas graficas, descompuso. De 497 lineas paso a 250

Que hice ?

De momento gemini es ganador asi que lo mejor quese puede hacer es

  • Meter los ajustes graficos a mano Yo mismo.
  • Pedirle a Claude que integre otras cosas
  • Yase hizo gemini 2.2 y se subió alrepositorio

Nota Importante:

Un error GRAVISIMO es que alguno de los modelos, no me fijé cuál, me borró el contenido de la base. En vez de IF NOT EXISTS CREATE me dio IF EXISTS DROP.

Resultados:

1. La paradoja del benchmark El modelo que más errores técnicos tenía en análisis estático (base64 inline, fue el único que funcionó al 90%. Código “sucio” que corre vs código “limpio” que no hace nada.

2. El talón de Aquiles compartido mime_content_type() mató a Gemini Grok y Qwen también. Los tres necesitaron una función rescatada de Gemini anterior. Ningún modelo verificó disponibilidad de extensiones PHP del servidor real.

3. Tamaño vs funcionalidad

  • Meta AI: el más grande → 1/10
  • Gemini: uno de los más pequeños → 9/10
  • Gemni v2 Modificado por Claude  9.5/10
    • Cambia de 22 a 45 kb pero mas pequeño que Meta.AI

Ranking final definitivo ejecución real:

Pos Modelo Puntos
🥇 Gemini 9/10
🥈 Grok 7/10
🥉 Claude 6/10
4 DeepSeek 2/10
5 Mistral 1/10
5 Meta AI 1/10
Copilot/Cohere/Qwen/MiniMax/Stepfun 0/10

Codigo ya esta en Repositorio Activo :

https://github.com/AlfonsoOrozcoAguilarnoNDA/vibeCodingGestorCarpetaDescargas

 

Related Posts

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *