Този урок демонстрира как можете да качвате файлове в различни формати, включително .zip, .pdf, .docx, .ppt, както и файлове с изображения чрез формуляр, използващ PHP, който да се съхранява в папка на нашия сървър.
Също така ще запишем името на качените файлове и свързаната информация, като име на файла, размер и брой изтегляния в таблица на база данни.
Създайте нова папка на PHP проект и я наречете файл-качване-изтегляне. Създайте подпапка в тази папка, наречена uploads (това е мястото, където ще се съхраняват нашите качени файлове), и файл, наречен index.php.
index.php е мястото, където ще създадем нашия формуляр за качване на файлове. Отворете го и поставете този код вътре:
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>
Това е много прост формуляр, който отнема само полето за въвеждане на нашия файл и бутон за качване.
В секцията глава се свързваме към нашия файл style.css, за да предоставим стил на нашата форма. Създайте този файл в корена на нашето приложение и добавете този 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;
}
В горната част на index.php включваме filesLogic.php файл. Това е файлът, който съдържа цялата логика на получаването на изпратения от нас файл и запазването му в папката за качвания, както и съхраняването на информацията за файла в базата данни. Нека създадем този файл сега.
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.";
}
}
}
В горната част на този файл се свързваме с база данни, но все още не сме я създали. Нека го направим сега.
Създайте нова база данни, наречена управление на файлове. Под тази база данни създайте таблица, наречена файлове и й дайте следните полета.
- id - INT
- име - VARCHAR(255)
- размер - INT
- изтегляния
Сега отворете файла index.php във вашия браузър. За мен ще се насоча към http://localhost/file-upload-download/download.php.
Щракнете върху полето за въвеждане на файл и изберете всеки файл от вашето устройство за качване.
Забележка:В зависимост от вашата php конфигурация, вашият файл може да не успее да се качи, ако размерът надвишава стойността upload_max_filesize, зададена във вашия файл php.ini. Винаги можете да конфигурирате тази информация във вашия php.ini файл. Увеличете стойностите на post_max_size и upload_max_filesize .
След като изберете вашия файл, можете да кликнете върху бутона за качване. Ако всичко върви добре, вашият файл ще бъде качен в папката за качвания във вашия проект и ще бъде създаден нов запис в таблицата с файлове в базата данни, съдържащ името на файла, размера и броя на изтеглянията.
Сега нашият файл е качен. Можете да проверите папката си за качвания и таблицата на базата данни, за да потвърдите, че са били успешни. Нека го покажем, така че потребителят да може да го види и да щракне върху него, за да го изтегли. Първо, трябва да извлечем информацията за файла от базата данни.
Отворете filesLogic.php и добавете тези 3 реда код точно под реда, където се свързваме с базата данни:
<?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);
Това избира цялата информация за файловете от базата данни и я задава на променлива от масив, наречена $files.
Сега създайте файл, наречен downloads.php в основната папка на нашето приложение и добавете този код вътре:
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>
Сега на тази страница информацията за файловете от базата данни е изброена всеки заедно с неговия размер в КБ и брой изтегляния. Към всеки файл има и бутон за изтегляне. Това, което остава сега, е кодът, който всъщност изтегля файла от нашата папка за качване. Нека напишем кода веднага.
Отворете отново filesLogic.php и добавете този код в края на файла:
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;
}
}
Когато изброявахме файловете, всеки бутон за изтегляне (или по-скоро връзка за изтегляне) имаше параметър, наречен file_id , прикачен към него. Така че, когато щракнете върху връзката за изтегляне на файл, идентификаторът на този файл се изпраща на страницата filesLogic.php и се грабва от тази част от кода, която току-що добавихме сега.
След това кодът извлича тази конкретна информация за файл от базата данни с помощта на параметъра file_id и след това съхранява информацията за файла в променлива, наречена $file. Използвайки метода file_exists() на PHP с пълния път до нашия файл като аргумент, ние проверяваме дали файлът действително съществува в нашата папка за качвания. След това продължаваме да задаваме някои заглавки и накрая отговаряме с файла на потребителя, използвайки функцията readFile() в PHP.
След като файлът бъде изтеглен, ние актуализираме броя на изтеглянията за този конкретен файл в базата данни.
Заключение
Това е всичко с качване и изтегляне на файлове. Можете допълнително да го персонализирате, за да създавате страхотни PHP приложения. Благодаря ви много за следването. Кажете ми какво мислите за тази статия в секцията за коментари по-долу, ако обичате.
Приятно изкарване!