Den här handledningen visar hur du kan ladda upp filer i olika format, inklusive .zip, .pdf, .docx, .ppt, samt bildfiler genom ett formulär som använder PHP för att lagras i en mapp på vår server.
Vi kommer också att registrera namnet på de uppladdade filerna och relaterad information som filnamn, storlek och antalet nedladdningar i en databastabell.
Skapa en ny PHP-projektmapp och kalla den för fil-uppladdning-nedladdning. Skapa en undermapp i den här mappen som heter uppladdningar (det är här våra uppladdade filer kommer att lagras) och en fil som heter index.php.
index.php är där vi kommer att skapa vårt filuppladdningsformulär. Öppna den och lägg den här koden i den:
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>
Det är ett mycket enkelt formulär som tar bara inmatningsfältet för vår fil och en uppladdningsknapp.
I huvudsektionen länkar vi till vår style.css-fil för att ge lite styling till vårt formulär. Skapa den filen i roten av vår applikation och lägg till denna CSS-kod till den:
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;
}
Överst i index.php inkluderar vi filen filesLogic.php. Det här är filen som innehåller all logik för att ta emot vår inskickade fil och spara den i uppladdningsmappen samt lagra filinformationen i databasen. Låt oss skapa den här filen nu.
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.";
}
}
}
Överst i den här filen ansluter vi till en databas men vi har inte skapat den ännu. Låt oss göra det nu.
Skapa en ny databas som heter filhantering. Under den här databasen skapar du en tabell som heter filer och ge den följande fält.
- id - INT
- namn - VARCHAR(255)
- storlek - INT
- nedladdningar
Öppna nu filen index.php i din webbläsare. För mig går jag över till http://localhost/file-upload-download/download.php.
Klicka på filinmatningsfältet och välj en fil från din maskin att ladda upp.
Obs:Beroende på din php-konfiguration kan det hända att din fil inte laddas upp om storleken överstiger värdet upload_max_filesize som är inställt i din php.ini-fil. Du kan alltid konfigurera denna information i din php.ini-fil. Öka värdena för post_max_size och upload_max_filesize .
När du har valt din fil kan du klicka på uppladdningsknappen. Om allt går bra kommer din fil att laddas upp till uppladdningsmappen i ditt projekt och en ny post skapas i filtabellen i databasen som innehåller filnamn, storlek och antal nedladdningar.
Nu har vår fil laddats upp. Du kan kontrollera din uppladdningsmapp och databastabell för att bekräfta att den lyckades. Låt oss visa det så att användaren kan se det och klicka på det för att ladda ner det. Först måste vi hämta filinformationen från databasen.
Öppna filesLogic.php och lägg till dessa tre rader kod precis under raden där vi ansluter till databasen:
<?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);
Detta väljer all filinformation från databasen och ställer in den till en arrayvariabel som heter $filer.
Skapa nu en fil som heter downloads.php i rotmappen i vår applikation och lägg till denna kod i den:
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>
Nu på den här sidan listas filinformationen från databasen var och en tillsammans med dess storlek i kB och antal nedladdningar. Det finns också en nedladdningsknapp vid varje fil. Det som återstår nu är koden som faktiskt laddar ner filen från vår uppladdningsmapp. Låt oss skriva koden direkt.
Öppna filesLogic.php igen och lägg till denna kod i slutet av filen:
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;
}
}
När vi listade filerna hade varje nedladdningsknapp (eller snarare, nedladdningslänk) en parameter som heter file_id kopplad till sig. Så när du klickar på nedladdningslänken för en fil, skickas den filens id till sidan filesLogic.php och grips av den här kodbiten som vi just lagt till nu.
Koden hämtar sedan den specifika filinformationen från databasen med hjälp av parametern file_id och lagrar sedan filinformationen i en variabel som heter $file. Genom att använda PHP:s file_exists()-metod med den fullständiga sökvägen till vår fil som argument kontrollerar vi att filen faktiskt finns i vår uppladdningsmapp. Sedan fortsätter vi med att ställa in några rubriker och svarar slutligen med filen till användaren med funktionen readFile() i PHP.
Efter att filen har laddats ner uppdaterar vi antalet nedladdningar för just den filen i databasen.
Slutsats
Det är ungefär det med filuppladdning och nedladdning. Du kan anpassa den ytterligare för att bygga coola PHP-applikationer. Tack så mycket för att du följer. Låt mig veta vad du tycker om den här artikeln i kommentarsfältet nedan, om du vill.
Ha det så bra!