Cómo cargar y descargar archivos PHP y MySQL

Este tutorial demuestra cómo puede cargar archivos de varios formatos, incluidos .zip, .pdf, .docx, .ppt, así como archivos de imagen a través de un formulario usando PHP para ser almacenados en una carpeta en nuestro servidor.

También registraremos el nombre de los archivos cargados y la información relacionada, como el nombre del archivo, el tamaño y el número de descargas en una tabla de base de datos.

Crea una nueva carpeta de proyecto PHP y llámala carga-archivo-descarga. Cree una subcarpeta dentro de esta carpeta llamada cargas (aquí es donde se almacenarán nuestros archivos cargados), y un archivo llamado index.php.

index.php es donde crearemos nuestro formulario de carga de archivos. Ábrelo y pon este código dentro de él:

index.php:

<?php include 'filesLogic.php';?>
<!DOCTYPE html>
<html lang="en">
  <head>
    <link rel="stylesheet" href="style.css">
    <title>Files Upload and Download</title>
  </head>
  <body>
    <div class="container">
      <div class="row">
        <form action="index.php" method="post" enctype="multipart/form-data" >
          <h3>Upload File</h3>
          <input type="file" name="myfile"> <br>
          <button type="submit" name="save">upload</button>
        </form>
      </div>
    </div>
  </body>
</html>

Es un formulario muy simple que solo toma el campo de entrada de nuestro archivo y un botón de carga.

En la sección de encabezado, estamos vinculando a nuestro archivo style.css para proporcionar algo de estilo a nuestro formulario. Cree ese archivo en la raíz de nuestra aplicación y agregue este código CSS:

style.css:

form {
  width: 30%;
  margin: 100px auto;
  padding: 30px;
  border: 1px solid #555;
}
input {
  width: 100%;
  border: 1px solid #f1e1e1;
  display: block;
  padding: 5px 10px;
}
button {
  border: none;
  padding: 10px;
  border-radius: 5px;
}
table {
  width: 60%;
  border-collapse: collapse;
  margin: 100px auto;
}
th,
td {
  height: 50px;
  vertical-align: center;
  border: 1px solid black;
}

En la parte superior de index.php, incluimos filesLogic.php filete. Este es el archivo que contiene toda la lógica de recibir nuestro archivo enviado y guardarlo en el cargas carpeta, así como almacenar la información del archivo en la base de datos. Creemos este archivo ahora.

filesLogic.php:

<?php
// connect to the database
$conn = mysqli_connect('localhost', 'root', '', 'file-management');

// Uploads files
if (isset($_POST['save'])) { // if save button on the form is clicked
    // name of the uploaded file
    $filename = $_FILES['myfile']['name'];

    // destination of the file on the server
    $destination = 'uploads/' . $filename;

    // get the file extension
    $extension = pathinfo($filename, PATHINFO_EXTENSION);

    // the physical file on a temporary uploads directory on the server
    $file = $_FILES['myfile']['tmp_name'];
    $size = $_FILES['myfile']['size'];

    if (!in_array($extension, ['zip', 'pdf', 'docx'])) {
        echo "You file extension must be .zip, .pdf or .docx";
    } elseif ($_FILES['myfile']['size'] > 1000000) { // file shouldn't be larger than 1Megabyte
        echo "File too large!";
    } else {
        // move the uploaded (temporary) file to the specified destination
        if (move_uploaded_file($file, $destination)) {
            $sql = "INSERT INTO files (name, size, downloads) VALUES ('$filename', $size, 0)";
            if (mysqli_query($conn, $sql)) {
                echo "File uploaded successfully";
            }
        } else {
            echo "Failed to upload file.";
        }
    }
}

En la parte superior de este archivo, nos estamos conectando a una base de datos, pero aún no la hemos creado. Hagámoslo ahora.

Crea una nueva base de datos llamada gestión de archivos. Bajo esta base de datos, cree una tabla llamada archivos y dale los siguientes campos.

  • el INT
  • nombre – VARCHAR (255)
  • tamaño – INT
  • descargas

Ahora abierto index.php archivo en su navegador. Para mí, iré a http: //localhost/file-upload-download/download.php.

Haga clic en el campo de entrada del archivo y seleccione cualquier archivo de su máquina para cargar.

Nota: Dependiendo de su configuración de php, es posible que su archivo no se cargue si el tamaño excede el valor upload_max_filesize establecido en su archivo php.ini. Siempre puede configurar esta información en su archivo php.ini. Incrementar los valores de post_max_size y upload_max_filesize .

Una vez seleccionado su archivo, puede hacer clic en el botón de carga. Si todo va bien, su archivo se cargará en el cargas carpeta en su proyecto y se creará un nuevo registro en el archivos tabla de la base de datos que contiene el nombre de archivo, el tamaño y el recuento de descargas.

Ahora nuestro archivo se ha subido. Puedes comprobar el tuyo cargas carpeta y tabla de la base de datos para confirmar que se realizó correctamente. Vamos a mostrarlo para que el usuario pueda verlo y hacer clic en él para descargarlo. Primero, necesitamos buscar la información del archivo de la base de datos.

<?php
// connect to database
$conn = mysqli_connect('localhost', 'root', '', 'file-management');

$sql = "SELECT * FROM files";
$result = mysqli_query($conn, $sql);

$files = mysqli_fetch_all($result, MYSQLI_ASSOC);

Esto selecciona toda la información de los archivos de la base de datos y la establece en una variable de matriz llamada $ files.

Ahora crea un archivo llamado downloads.php en la carpeta raíz de nuestra aplicación y agregue este código dentro de ella:

downloads.php:

<?php include 'filesLogic.php';?>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <link rel="stylesheet" href="style.css">
  <title>Download files</title>
</head>
<body>

<table>
<thead>
    <th>ID</th>
    <th>Filename</th>
    <th>size (in mb)</th>
    <th>Downloads</th>
    <th>Action</th>
</thead>
<tbody>
  <?php foreach ($files as $file): ?>
    <tr>
      <td><?php echo $file['id']; ?></td>
      <td><?php echo $file['name']; ?></td>
      <td><?php echo floor($file['size'] / 1000) . ' KB'; ?></td>
      <td><?php echo $file['downloads']; ?></td>
      <td><a href="downloads.php?file_id=<?php echo $file['id'] ?>">Download</a></td>
    </tr>
  <?php endforeach;?>

</tbody>
</table>

</body>
</html>

Ahora, en esta página, la información de los archivos de la base de datos se enumera cada uno junto con su tamaño en KB y el número de descargas. También hay un botón de descarga para cada archivo. Lo que queda ahora es el código que realmente descarga el archivo de nuestra cargas carpeta. Escribamos el código de inmediato.

Abra filesLogic.php nuevamente y agregue este código al final del archivo:

filesLogic.php:


// Downloads files
if (isset($_GET['file_id'])) {
    $id = $_GET['file_id'];

    // fetch file to download from database
    $sql = "SELECT * FROM files WHERE id=$id";
    $result = mysqli_query($conn, $sql);

    $file = mysqli_fetch_assoc($result);
    $filepath = 'uploads/' . $file['name'];

    if (file_exists($filepath)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename=' . basename($filepath));
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize('uploads/' . $file['name']));
        readfile('uploads/' . $file['name']);

        // Now update downloads count
        $newCount = $file['downloads'] + 1;
        $updateQuery = "UPDATE files SET downloads=$newCount WHERE id=$id";
        mysqli_query($conn, $updateQuery);
        exit;
    }

}

Cuando estábamos listando los archivos, cada botón de descarga (o más bien, enlace de descarga) tenía un parámetro llamado file_id adjunto a. Entonces, cuando hace clic en el enlace de descarga de un archivo, la identificación de ese archivo se envía a la página filesLogic.php y es capturada por este fragmento de código que acabamos de agregar ahora.

Luego, el código recupera la información de ese archivo en particular de la base de datos utilizando el file_id parámetro y luego almacena la información del archivo en una variable llamada $ archivo. Usando el método file_exists () de PHP con la ruta completa a nuestro archivo como argumento, verificamos que el archivo realmente existe en nuestra carpeta de cargas. Luego procedemos a configurar algunos encabezados y finalmente respondemos con el archivo al usuario usando el readFile () función en PHP.

Una vez que se descarga el archivo, actualizamos el recuento de descargas para ese archivo en particular en la base de datos.

Conclusión

Eso es todo con la carga y descarga de archivos. Puede personalizarlo aún más para crear aplicaciones PHP geniales. Muchas gracias por seguirme. Hágame saber lo que piensa sobre este artículo en la sección de comentarios a continuación, si es así.

¡Pasar un buen rato!

Awa Melvine

Deja un comentario