0Pricing
PHP Academy · Lección

Gestión de cargas de archivos

Procese archivos cargados de forma segura mediante la superglobal _FILES.

Gestión de cargas de archivos es una lección gratuita de PHP Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de PHP Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de PHP Academy incluye 4 lecciones en total.

Descripción general de las cargas de archivos en PHP

PHP gestiona las cargas de archivos mediante la superglobal $_FILES. El formulario debe usar method="POST" y enctype="multipart/form-data".

Formulario HTML de carga

Configuración del formulario HTML para cargar uno o varios archivos:

<!-- Single file -->
<form method="POST" action="upload.php"
      enctype="multipart/form-data">
    <input type="file" name="document">
    <button>Upload</button>
</form>

<!-- Multiple files -->
<form method="POST" enctype="multipart/form-data">
    <input type="file" name="photos[]" multiple>
    <button>Upload All</button>
</form>

Estructura de $_FILES

Cada archivo cargado tiene cinco elementos en $_FILES:

<?php
$file = $_FILES['document'];

echo $file['name'];      // original name: report.pdf
echo $file['type'];      // browser-reported MIME: application/pdf
echo $file['tmp_name'];  // server temp path: /tmp/phpXXXXXX
echo $file['error'];     // error code: 0 = UPLOAD_ERR_OK
echo $file['size'];      // file size in bytes

Códigos de error de carga

Compruebe siempre $file['error'] antes de procesarlo:

<?php
$errorMessages = [
    UPLOAD_ERR_INI_SIZE   => 'Exceeds upload_max_filesize in php.ini',
    UPLOAD_ERR_FORM_SIZE  => 'Exceeds MAX_FILE_SIZE in form',
    UPLOAD_ERR_PARTIAL    => 'Only partially uploaded',
    UPLOAD_ERR_NO_FILE    => 'No file uploaded',
    UPLOAD_ERR_NO_TMP_DIR => 'Missing temp folder',
    UPLOAD_ERR_CANT_WRITE => 'Failed to write to disk',
    UPLOAD_ERR_EXTENSION  => 'PHP extension stopped upload',
];

$err = $_FILES['doc']['error'];
if ($err !== UPLOAD_ERR_OK) {
    die($errorMessages[$err] ?? 'Unknown error');
}

Validar el tipo de archivo de forma segura

Nunca confíe en el tipo MIME proporcionado por el navegador; verifíquelo con el contenido real del archivo:

<?php
$tmp  = $_FILES['image']['tmp_name'];
$allowed = ['image/jpeg', 'image/png', 'image/webp'];

// Check real MIME type from file content
$realMime = mime_content_type($tmp);

if (!in_array($realMime, $allowed)) {
    die('Invalid file type: ' . $realMime);
}

Validar el tamaño del archivo

Establezca límites de tamaño en el servidor incluso si el formulario HTML tiene un campo oculto MAX_FILE_SIZE:

<?php
$maxBytes = 5 * 1024 * 1024;  // 5MB
$size     = $_FILES['video']['size'];

if ($size > $maxBytes) {
    $mb = round($size / 1024 / 1024, 2);
    die("File too large: {$mb}MB (max 5MB)");
}

is_uploaded_file y move_uploaded_file

Use siempre estas dos funciones para confirmar que el archivo llegó mediante una carga HTTP y moverlo de forma segura:

<?php
$tmp  = $_FILES['photo']['tmp_name'];
$dest = '/var/www/uploads/' . basename($_FILES['photo']['name']);

if (!is_uploaded_file($tmp)) {
    die('Not an uploaded file — possible attack');
}

if (!move_uploaded_file($tmp, $dest)) {
    die('Failed to move uploaded file');
}

echo 'Upload saved to: ' . $dest;

Generar nombres de archivo seguros

Genere un nombre de archivo aleatorio para evitar ataques de traversal de directorios y sobrescrituras:

<?php
$originalName = $_FILES['doc']['name'];
$ext          = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));

$allowedExts = ['jpg', 'jpeg', 'png', 'pdf'];
if (!in_array($ext, $allowedExts)) {
    die('File type not allowed');
}

$safeName = bin2hex(random_bytes(16)) . '.' . $ext;
$dest     = '/var/www/uploads/' . $safeName;

move_uploaded_file($_FILES['doc']['tmp_name'], $dest);

Gestionar varias cargas de archivos

Al usar name="photos[]", $_FILES contiene arrays; recórralos:

<?php
$files = $_FILES['photos'];
$count = count($files['name']);

for ($i = 0; $i < $count; $i++) {
    if ($files['error'][$i] !== UPLOAD_ERR_OK) continue;
    
    $tmp  = $files['tmp_name'][$i];
    $ext  = pathinfo($files['name'][$i], PATHINFO_EXTENSION);
    $dest = '/uploads/' . uniqid() . '.' . strtolower($ext);
    
    move_uploaded_file($tmp, $dest);
    echo "Saved: $dest" . PHP_EOL;
}

Configuración de cargas en php.ini

Directivas principales de php.ini que afectan a las cargas de archivos:

  • file_uploads = On — habilita las cargas
  • upload_max_filesize = 8M — tamaño máximo de un archivo
  • post_max_size = 32M — tamaño máximo del cuerpo POST (debe ser mayor que upload_max_filesize)
  • max_file_uploads = 20 — número máximo de archivos por solicitud

Cambiar el tamaño de imágenes después de cargarlas

Use la biblioteca GD para cambiar el tamaño de las imágenes después de cargarlas:

<?php
function resizeImage(string $src, string $dst, int $maxW): void {
    [$w, $h, $type] = getimagesize($src);
    $ratio   = $maxW / $w;
    $newH    = (int) ($h * $ratio);
    $srcImg  = imagecreatefromjpeg($src);
    $dstImg  = imagecreatetruecolor($maxW, $newH);
    imagecopyresampled($dstImg, $srcImg, 0,0,0,0, $maxW, $newH, $w, $h);
    imagejpeg($dstImg, $dst, 90);
    imagedestroy($srcImg);
    imagedestroy($dstImg);
}

Comprobación rápida

¿Qué función de PHP se necesita para mover de forma segura un archivo cargado a su destino final?

Resumen: Cargas de archivos

Lista de comprobación para gestionar cargas:

  • El formulario debe usar method=POST enctype=multipart/form-data
  • Compruebe $_FILES['field']['error'] === UPLOAD_ERR_OK
  • Valide el tipo MIME real con mime_content_type()
  • Valide el tamaño del archivo en el servidor
  • Use move_uploaded_file(), no rename/copy
  • Genere nombres de archivo aleatorios para evitar conflictos

Preguntas frecuentes

¿La lección «Gestión de cargas de archivos» es gratis?

Sí — el texto completo de «Gestión de cargas de archivos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de PHP Academy, actualiza a CoddyKit PRO. El curso de PHP Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Gestión de cargas de archivos»?

Procese archivos cargados de forma segura mediante la superglobal _FILES. Practicas PHP Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar PHP Academy?

No se requiere experiencia previa. PHP Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Gestión de cargas de archivos»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de PHP Academy?

Sí. Cada lección de PHP Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Lectura de archivos con PHP
  2. Escritura y adición en archivos
  3. Trabajo con directorios
  4. Gestión de cargas de archivos
← Volver a PHP Academy