sql >> Base de Datos >  >> RDS >> Mysql

Cómo subir 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 que usa PHP para almacenarlos 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 la cantidad de descargas en una tabla de base de datos.

Cree una nueva carpeta de proyecto PHP y llámela carga-descarga de archivos. 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:

índice.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 para 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 agréguele este código CSS:

estilo.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 el archivo filesLogic.php. Este es el archivo que contiene toda la lógica de recibir nuestro archivo enviado y guardarlo en la carpeta de carga, además de almacenar la información del archivo en la base de datos. Vamos a crear este archivo ahora.

archivosLogic.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.

Cree una nueva base de datos llamada administración de archivos. En esta base de datos, cree una tabla llamada archivos y asígnele los siguientes campos.

  • id - INT
  • nombre - VARCHAR(255) 
  • tamaño - INT
  • descargas

Ahora abra el archivo index.php en su navegador. En mi caso, me dirigiré a http://localhost/file-upload-download/download.php.

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

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. Aumente 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 la carpeta de cargas de su proyecto y se creará un nuevo registro en la tabla de archivos de la base de datos que contiene el nombre del archivo, el tamaño y el número de descargas.

Ahora nuestro archivo ha sido subido. Puede verificar su carpeta de cargas y la 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 obtener la información del archivo de la base de datos.

Abra filesLogic.php y agregue estas 3 líneas de código justo debajo de la línea donde nos conectamos a 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 $archivos.

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

descargas.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 la cantidad de descargas. También hay un botón de descarga en cada archivo. Lo que queda ahora es el código que realmente descarga el archivo de nuestra carpeta de cargas. Escribamos el código de inmediato.

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

archivosLogic.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 enumerando los archivos, cada botón de descarga (o más bien, enlace de descarga) tenía un parámetro llamado file_id adjunto. 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 de filesLogic.php y es capturada por este fragmento de código que acabamos de agregar ahora.

Luego, el código obtiene la información de ese archivo en particular de la base de datos usando el parámetro file_id y luego almacena la información del archivo en una variable llamada $file. 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 carga. Luego procedemos a configurar algunos encabezados y finalmente respondemos con el archivo al usuario usando la función readFile() en PHP.

Después de descargar 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 seguir. Hágame saber lo que piensa acerca de este artículo en la sección de comentarios a continuación, por favor.

¡Que lo pases bien!