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ě!