sql >> Database >  >> RDS >> Mysql

Bestanden uploaden en downloaden PHP en MySQL

Deze tutorial laat zien hoe je bestanden van verschillende formaten kunt uploaden, waaronder .zip, .pdf, .docx, .ppt, evenals afbeeldingsbestanden via een formulier met PHP om te worden opgeslagen in een map op onze server.

We zullen ook de naam van de geüploade bestanden en gerelateerde informatie, zoals de bestandsnaam, grootte en het aantal downloads, opnemen in een databasetabel.

Maak een nieuwe PHP-projectmap en noem deze file-upload-download. Maak een submap in deze map met de naam uploads (dit is waar onze geüploade bestanden worden opgeslagen), en een bestand met de naam index.php.

index.php is waar we ons bestandsuploadformulier zullen maken. Open het en plaats deze code erin:

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>

Het is een heel eenvoudig formulier dat alleen het invoerveld voor ons bestand en een uploadknop nodig heeft.

In het hoofdgedeelte linken we naar ons style.css-bestand om wat styling aan ons formulier te geven. Maak dat bestand aan in de hoofdmap van onze applicatie en voeg deze CSS-code eraan toe:

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

Bovenaan index.php nemen we het bestand filesLogic.php op. Dit is het bestand dat alle logica bevat om ons ingediende bestand te ontvangen en op te slaan in de uploadmap en om de bestandsinformatie in de database op te slaan. Laten we dit bestand nu maken.

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

Bovenaan dit bestand maken we verbinding met een database, maar we hebben deze nog niet aangemaakt. Laten we dat nu doen.

Maak een nieuwe database met de naam bestandsbeheer. Maak onder deze database een tabel met de naam bestanden en geef deze de volgende velden.

  • id - INT
  • naam - VARCHAR(255) 
  • maat - INT
  • downloads

Open nu het index.php-bestand in uw browser. Voor mij ga ik naar http://localhost/file-upload-download/download.php.

Klik op het bestandsinvoerveld en selecteer een bestand van uw machine om te uploaden.

Opmerking:afhankelijk van uw php-configuratie, kan het zijn dat uw bestand niet kan worden geüpload als de grootte groter is dan de waarde voor upload_max_filesize die is ingesteld in uw php.ini-bestand. U kunt deze informatie altijd configureren in uw php.ini-bestand. Verhoog de waarden van post_max_size en upload_max_filesize.

Nadat u uw bestand heeft geselecteerd, kunt u op de uploadknop klikken. Als alles goed gaat, wordt uw bestand geüpload naar de uploadmap in uw project en wordt er een nieuw record gemaakt in de bestandentabel in de database met de bestandsnaam, grootte en aantal downloads.

Nu is ons bestand geüpload. U kunt uw uploadmap en databasetabel controleren om te bevestigen dat dit is gelukt. Laten we het weergeven zodat de gebruiker het kan bekijken en erop klikken om het te downloaden. Eerst moeten we de bestandsinformatie uit de database halen.

Open filesLogic.php en voeg deze 3 regels code toe net onder de regel waar we verbinding maken met de database:

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

Dit selecteert alle bestandsinformatie uit de database en stelt deze in op een arrayvariabele genaamd $files.

Maak nu een bestand met de naam downloads.php in de hoofdmap van onze applicatie en voeg deze code erin toe:

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>

Op deze pagina worden nu de bestandsinformatie uit de database weergegeven, samen met de grootte in KB en het aantal downloads. Er is ook een downloadknop bij elk bestand. Wat nu overblijft, is de code die het bestand daadwerkelijk downloadt uit onze uploadmap. Laten we de code meteen schrijven.

Open filesLogic.php opnieuw en voeg deze code toe aan het einde van het bestand:

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

}

Toen we de bestanden opsomden, was aan elke downloadknop (of liever downloadlink) een parameter met de naam file_id aan gekoppeld. Dus wanneer u op de downloadlink van een bestand klikt, wordt de id van dat bestand naar de pagina filesLogic.php gestuurd en wordt het gegrepen door dit stukje code dat we zojuist hebben toegevoegd.

De code haalt vervolgens die specifieke bestandsinformatie op uit de database met behulp van de parameter file_id en slaat de bestandsinformatie vervolgens op in een variabele met de naam $file. Met behulp van de PHP-methode file_exists() met het volledige pad naar ons bestand als argument, controleren we of het bestand daadwerkelijk bestaat in onze uploadmap. Vervolgens gaan we verder met het instellen van enkele headers en reageren we uiteindelijk met het bestand aan de gebruiker met behulp van de readFile()-functie in PHP.

Nadat het bestand is gedownload, werken we het aantal downloads voor dat specifieke bestand in de database bij.

Conclusie

Dat is het zo'n beetje met het uploaden en downloaden van bestanden. Je kunt het verder aanpassen om coole PHP-apps te bouwen. Heel erg bedankt voor het volgen. Laat me alsjeblieft weten wat je van dit artikel vindt in de opmerkingen hieronder.

Veel plezier!


  1. MySQL:ALTER IGNORE TABLE geeft schending van integriteitsbeperking

  2. NIET IN selectie met NULL-waarden

  3. Hoe DIV werkt in MariaDB

  4. De versie van SQL Server die in gebruik is, ondersteunt het datatype datetime2 niet?