Subida de archivos PHP

A través de PHP, se puede subir archivos al servidor.

Crear un formulario de subida de archivos

Permitir que los usuarios suban archivos desde el formulario es muy útil.

Vea a continuación este formulario HTML para subir archivos:

<html>
<body>
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Nombre de archivo:</label>
<input type="file" name="file" id="file" /> 
<br />
<input type="submit" name="submit" value="Enviar" />
</form>
</body>
</html>

Por favor, tenga en cuenta la siguiente información sobre este formulario:

La propiedad enctype del etiqueta <form> especifica qué tipo de contenido se debe usar al enviar el formulario. Cuando el formulario necesita datos binarios, como el contenido de un archivo, utilice "multipart/form-data".

La propiedad type="file" del etiqueta <input> especifica que se debe manejar la entrada como un archivo. Por ejemplo, al previsualizar en el navegador, se verá un botón de navegación junto a la caja de entrada.

Notas:Permitir que los usuarios suban archivos es un riesgo de seguridad considerable. Por favor, permita solo que usuarios confiables ejecuten operaciones de subida de archivos.

Crear un script de subida

"upload_file.php" archivo contiene el código para subir archivos:

<?php
if ($_FILES["file"]["error"] > 0)
  {
  echo "Error: " . $_FILES["file"]["error"] . "<br />";
  }
else
  {
  echo "Subida: " . $_FILES["file"]["name"] . "<br />";
  echo "Tipo: " . $_FILES["file"]["type"] . "<br />";
  echo "Tamaño: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
  echo "Almacenado en: " . $_FILES["file"]["tmp_name"];
  }
?>

Al usar el array global de PHP $_FILES, puedes subir archivos desde la computadora del cliente al servidor remoto.

El primer parámetro es el nombre del input del formulario, el segundo índice puede ser "name", "type", "size", "tmp_name" o "error". Algo así:

  • $_FILES["file"]["name"] - Nombre del archivo subido
  • $_FILES["file"]["type"] - Tipo del archivo subido
  • $_FILES["file"]["size"] - Tamaño del archivo subido, en bytes
  • $_FILES["file"]["tmp_name"] - Nombre de la copia temporal del archivo almacenado en el servidor
  • $_FILES["file"]["error"] - Código de error causado por la subida de archivos

Esta es una manera muy simple de subir archivos. Por consideraciones de seguridad, debe aumentar las restricciones sobre qué usuarios tienen permiso para subir archivos.

Restricciones de subida

En este script, hemos agregado restricciones a la subida de archivos. El usuario solo puede subir archivos .gif o .jpeg, y el tamaño del archivo debe ser menor de 20 kb:

<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Error: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Subida: " . $_FILES["file"]["name"] . "<br />";
    echo "Tipo: " . $_FILES["file"]["type"] . "<br />";
    echo "Tamaño: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Almacenado en: " . $_FILES["file"]["tmp_name"];
    }
  }
else
  {
  echo "Archivo inválido";
  }
?>

Notas:Para IE, el tipo de archivo jpg debe ser pjpeg, para FireFox debe ser jpeg.

Guardar archivo subido

El ejemplo anterior creó una copia temporal del archivo subido en la carpeta temporal de PHP del servidor.

Este archivo de copia temporal desaparecerá al finalizar el script. Para guardar el archivo subido, necesitamos copiarlo a otra ubicación:

<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Código de retorno: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Subida: " . $_FILES["file"]["name"] . "<br />";
    echo "Tipo: " . $_FILES["file"]["type"] . "<br />";
    echo "Tamaño: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Archivo temporal: " . $_FILES["file"]["tmp_name"] . "<br />";
    if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " ya existe. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Almacenado en: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Archivo inválido";
  }
?>

El script superior verificó si el archivo existe, y si no existe, copió el archivo al carpeta especificada.

Notas:Este ejemplo guardó el archivo en una nueva carpeta llamada "upload".