Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да качвате и изтегляте файлове PHP и MySQL

Този урок демонстрира как можете да качвате файлове в различни формати, включително .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 приложения. Благодаря ви много за следването. Кажете ми какво мислите за тази статия в секцията за коментари по-долу, ако обичате.

Приятно изкарване!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Дължина на индекса на MySQL varchar

  2. Как да направя рекурсивната SELECT заявка в MySQL?

  3. Таблицата е „само за четене“

  4. Фатална грешка:Неуловено изключение „mysqli_sql_exception“ със съобщение „Не е използван индекс в заявката/подготвеното изявление“

  5. Завършете урока за Soft Delete &Restore Laravel 8 за изтрити записи