sql >> Databáze >  >> RDS >> Mysql

Jak nahrávat a stahovat soubory PHP a MySQL

Tento tutoriál ukazuje, jak můžete nahrát soubory různých formátů, včetně .zip, .pdf, .docx, .ppt, a také obrázkové soubory prostřednictvím formuláře pomocí PHP, které chcete uložit do složky na našem serveru.

Do databázové tabulky také zaznamenáme název nahraných souborů a související informace, jako je název souboru, velikost a počet stažení.

Vytvořte novou složku projektu PHP a nazvěte ji file-upload-download. V této složce vytvořte podsložku s názvem uploads (tam budou uloženy naše nahrané soubory) a soubor s názvem index.php.

index.php je místo, kde vytvoříme formulář pro nahrávání souborů. Otevřete jej a vložte do něj tento kód:

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>

Je to velmi jednoduchý formulář, který vyžaduje pouze vstupní pole pro náš soubor a tlačítko pro nahrání.

V sekci head odkazujeme na náš soubor style.css, abychom našemu formuláři poskytli nějaký styl. Vytvořte tento soubor v kořenovém adresáři naší aplikace a přidejte do něj tento CSS kód:

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

V horní části index.php uvádíme soubor filesLogic.php. Toto je soubor, který obsahuje veškerou logiku přijetí našeho odeslaného souboru a jeho uložení do složky pro nahrávání a také uložení informací o souboru do databáze. Nyní vytvoříme tento soubor.

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

V horní části tohoto souboru se připojujeme k databázi, ale ještě jsme ji nevytvořili. Udělejme to teď.

Vytvořte novou databázi s názvem file-management. V této databázi vytvořte tabulku nazvanou soubory a zadejte jí následující pole.

  • id – INT
  • název – VARCHAR(255) 
  • velikost – INT
  • stahování

Nyní otevřete soubor index.php ve svém prohlížeči. Pro mě zamířím na http://localhost/file-upload-download/download.php.

Klikněte na pole pro zadání souboru a vyberte libovolný soubor z vašeho počítače, který chcete nahrát.

Poznámka:V závislosti na vaší konfiguraci php se může stát, že se váš soubor nenahraje, pokud velikost překročí hodnotu upload_max_filesize nastavenou ve vašem souboru php.ini. Tyto informace můžete vždy nakonfigurovat ve svém souboru php.ini. Zvyšte hodnoty  post_max_size a upload_max_filesize .

Po výběru souboru můžete kliknout na tlačítko nahrát. Pokud vše půjde dobře, váš soubor bude nahrán do složky uploads ve vašem projektu a v tabulce souborů v databázi bude vytvořen nový záznam obsahující název souboru, velikost a počet stažení.

Nyní byl náš soubor nahrán. Můžete zkontrolovat složku pro nahrávání a databázovou tabulku a potvrdit, že to bylo úspěšné. Pojďme si jej zobrazit, aby si jej uživatel mohl prohlédnout a kliknutím na něj jej stáhnout. Nejprve musíme získat informace o souboru z databáze.

Otevřete filesLogic.php a přidejte tyto 3 řádky kódu těsně pod řádek, kde se připojujeme k databázi:

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

To vybere všechny informace o souborech z databáze a nastaví je na proměnnou pole nazvanou $files.

Nyní vytvořte soubor s názvem downloads.php v kořenové složce naší aplikace a přidejte do něj tento kód:

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>

Na této stránce jsou nyní uvedeny informace o souborech z databáze spolu s jejich velikostí v kB a počtem stažení. U každého souboru je také tlačítko ke stažení. Nyní zůstává kód, který ve skutečnosti stáhne soubor z naší složky pro nahrávání. Okamžitě napíšeme kód.

Otevřete znovu filesLogic.php a přidejte tento kód na konec souboru:

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

}

Když jsme vypisovali soubory, ke každému tlačítku stahování (nebo spíše odkazu ke stažení) byl připojen parametr nazvaný file_id. Takže když kliknete na odkaz ke stažení souboru, id tohoto souboru je odesláno na stránku filesLogic.php a je zachyceno tímto kouskem kódu, který jsme právě přidali.

Kód pak načte informace o konkrétním souboru z databáze pomocí parametru file_id a poté uloží informace o souboru do proměnné $file. Použitím metody file_exists() PHP s úplnou cestou k našemu souboru jako argumentu zkontrolujeme, zda soubor skutečně existuje v naší složce pro nahrávání. Poté přistoupíme k nastavení některých hlaviček a nakonec odpovíme se souborem uživateli pomocí funkce readFile() v PHP.

Po stažení souboru aktualizujeme počet stažení pro tento konkrétní soubor v databázi.

Závěr

To je asi vše s nahráváním a stahováním souborů. Můžete jej dále přizpůsobit a vytvářet skvělé aplikace PHP. Děkuji moc za sledování. Pokud chcete, dejte mi vědět, co si o tomto článku myslíte, v sekci komentářů níže.

Mějte se krásně!


  1. Sloupec vyšší mohutnosti jako první v indexu při použití rozsahu?

  2. Dochází k zásahu do výkonu pomocí desítkových datových typů (MySQL / Postgres)

  3. Co je Undo and Redo v databázi Oracle

  4. Jak použít metodu bindValue v klauzuli LIMIT?