Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment charger et télécharger des fichiers PHP et MySQL

Ce didacticiel montre comment vous pouvez télécharger des fichiers de différents formats, notamment .zip, .pdf, .docx, .ppt, ainsi que des fichiers image via un formulaire utilisant PHP à stocker dans un dossier sur notre serveur.

Nous enregistrerons également le nom des fichiers téléchargés et les informations associées telles que le nom du fichier, sa taille et le nombre de téléchargements dans une table de base de données.

Créez un nouveau dossier de projet PHP et appelez-le file-upload-download. Créez un sous-dossier dans ce dossier appelé uploads (c'est là que nos fichiers importés seront stockés) et un fichier appelé index.php.

index.php est l'endroit où nous allons créer notre formulaire de téléchargement de fichiers. Ouvrez-le et mettez ce code à l'intérieur :

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>

C'est un formulaire très simple qui ne prend que le champ de saisie de notre fichier et un bouton de téléchargement.

Dans la section d'en-tête, nous établissons un lien vers notre fichier style.css pour donner un style à notre formulaire. Créez ce fichier à la racine de notre application et ajoutez-y ce code 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 haut de index.php, nous incluons le fichier filesLogic.php. Il s'agit du fichier qui contient toute la logique de réception de notre fichier soumis et de son enregistrement dans le dossier de téléchargement ainsi que du stockage des informations du fichier dans la base de données. Créons ce fichier maintenant.

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 haut de ce fichier, nous nous connectons à une base de données mais nous ne l'avons pas encore créée. Faisons-le maintenant.

Créez une nouvelle base de données appelée file-management. Sous cette base de données, créez une table appelée files et attribuez-lui les champs suivants.

  • id - INT
  • nom - VARCHAR(255) 
  • taille - INT
  • téléchargements

Ouvrez maintenant le fichier index.php dans votre navigateur. Pour moi, je vais me diriger vers http://localhost/file-upload-download/download.php.

Cliquez sur le champ de saisie de fichier et sélectionnez n'importe quel fichier de votre machine à télécharger.

Remarque :Selon votre configuration php, votre fichier peut ne pas être téléchargé si la taille dépasse la valeur upload_max_filesize définie dans votre fichier php.ini. Vous pouvez toujours configurer ces informations dans votre fichier php.ini. Augmentez les valeurs de  post_max_size et upload_max_filesize .

Après avoir sélectionné votre fichier, vous pouvez cliquer sur le bouton de téléchargement. Si tout se passe bien, votre fichier sera téléchargé dans le dossier des téléchargements de votre projet et un nouvel enregistrement sera créé dans la table des fichiers de la base de données contenant le nom du fichier, sa taille et le nombre de téléchargements.

Maintenant, notre fichier a été téléchargé. Vous pouvez vérifier votre dossier de téléchargement et votre table de base de données pour confirmer que cela a réussi. Affichez-le pour que l'utilisateur puisse le voir et cliquez dessus pour le télécharger. Tout d'abord, nous devons récupérer les informations sur le fichier dans la base de données.

Ouvrez filesLogic.php et ajoutez ces 3 lignes de code juste en dessous de la ligne où nous nous connectons à la base de données :

<?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);

Cela sélectionne toutes les informations sur les fichiers de la base de données et les définit sur une variable tableau appelée $files.

Créez maintenant un fichier appelé downloads.php dans le dossier racine de notre application et ajoutez-y ce code :

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>

Désormais, sur cette page, les informations sur les fichiers de la base de données sont répertoriées, chacune avec sa taille en Ko et le nombre de téléchargements. Il y a aussi un bouton de téléchargement contre chaque fichier. Ce qui reste maintenant est le code qui télécharge réellement le fichier à partir de notre dossier de téléchargement. Écrivons le code tout de suite.

Ouvrez à nouveau filesLogic.php et ajoutez ce code à la fin du fichier :

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;
    }

}

Lorsque nous répertorions les fichiers, chaque bouton de téléchargement (ou plutôt lien de téléchargement) était associé à un paramètre appelé file_id. Ainsi, lorsque vous cliquez sur le lien de téléchargement d'un fichier, l'identifiant de ce fichier est envoyé à la page filesLogic.php et est saisi par ce morceau de code que nous venons d'ajouter maintenant.

Le code récupère ensuite ces informations de fichier particulières à partir de la base de données à l'aide du paramètre file_id, puis stocke les informations de fichier dans une variable appelée $file. En utilisant la méthode file_exists() de PHP avec le chemin d'accès complet à notre fichier comme argument, nous vérifions que le fichier existe réellement dans notre dossier de téléchargement. Ensuite, nous procédons à la définition de quelques en-têtes et enfin répondons avec le fichier à l'utilisateur en utilisant la fonction readFile() en PHP.

Une fois le fichier téléchargé, nous mettons à jour le nombre de téléchargements pour ce fichier particulier dans la base de données.

Conclusion

C'est à peu près tout avec le téléchargement et le téléchargement de fichiers. Vous pouvez le personnaliser davantage pour créer des applications PHP intéressantes. Merci beaucoup d'avoir suivi. Faites-moi savoir ce que vous pensez de cet article dans la section des commentaires ci-dessous, s'il vous plaît.

Passez un bon moment !