Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak przesyłać i pobierać pliki PHP i MySQL

Ten samouczek pokazuje, w jaki sposób można przesyłać pliki w różnych formatach, w tym .zip, .pdf, .docx, .ppt, a także pliki graficzne za pomocą formularza przy użyciu PHP, które mają być przechowywane w folderze na naszym serwerze.

Będziemy również rejestrować nazwy przesłanych plików i powiązane informacje, takie jak nazwa pliku, rozmiar i liczba pobrań w tabeli bazy danych.

Utwórz nowy folder projektu PHP i nazwij go file-upload-download. W tym folderze utwórz podfolder o nazwie uploads (w tym miejscu będą przechowywane przesłane pliki) i plik o nazwie index.php.

index.php to miejsce, w którym utworzymy formularz przesyłania plików. Otwórz go i umieść w nim ten kod:

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>

Jest to bardzo prosty formularz, który zawiera tylko pole wejściowe dla naszego pliku i przycisk przesyłania.

W sekcji head łączymy się z naszym plikiem style.css, aby nadać formę naszemu formularzowi. Utwórz ten plik w katalogu głównym naszej aplikacji i dodaj do niego ten kod 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;
}

U góry index.php dołączamy plik filesLogic.php. Jest to plik zawierający całą logikę odbierania przesłanego pliku i zapisywania go w folderze przesyłania, a także przechowywania informacji o pliku w bazie danych. Stwórzmy teraz ten plik.

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

W górnej części tego pliku łączymy się z bazą danych, ale jeszcze jej nie utworzyliśmy. Zróbmy to teraz.

Utwórz nową bazę danych o nazwie zarządzanie plikami. W tej bazie danych utwórz tabelę o nazwie pliki i nadaj jej następujące pola.

  • id - INT
  • nazwa - VARCHAR(255) 
  • rozmiar - INT
  • pobrane

Teraz otwórz plik index.php w przeglądarce. Dla mnie przejdę do http://localhost/file-upload-download/download.php.

Kliknij pole wejściowe pliku i wybierz dowolny plik ze swojego komputera do przesłania.

Uwaga:W zależności od konfiguracji php, przesłanie pliku może się nie powieść, jeśli rozmiar przekracza wartość upload_max_filesize ustawioną w pliku php.ini. Zawsze możesz skonfigurować te informacje w swoim pliku php.ini. Zwiększ wartości post_max_size i upload_max_filesize.

Po wybraniu pliku możesz kliknąć przycisk przesyłania. Jeśli wszystko pójdzie dobrze, plik zostanie przesłany do folderu przesyłania w projekcie, a w tabeli plików w bazie danych zostanie utworzony nowy rekord zawierający nazwę pliku, rozmiar i liczbę pobrań.

Teraz nasz plik został przesłany. Możesz sprawdzić folder przesyłania i tabelę bazy danych, aby potwierdzić, że się powiodło. Wyświetlmy go, aby użytkownik mógł go zobaczyć i kliknąć, aby go pobrać. Najpierw musimy pobrać informacje o pliku z bazy danych.

Otwórz filesLogic.php i dodaj te 3 wiersze kodu tuż pod wierszem, w którym łączymy się z bazą danych:

<?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 wybiera wszystkie informacje o plikach z bazy danych i ustawia je na zmienną tablicową o nazwie $files.

Teraz utwórz plik o nazwie downloads.php w głównym folderze naszej aplikacji i dodaj do niego następujący kod:

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>

Teraz na tej stronie informacje o plikach z bazy danych są wymienione wraz z ich rozmiarem w KB i liczbą pobrań. Przy każdym pliku znajduje się również przycisk pobierania. To, co pozostaje, to kod, który faktycznie pobiera plik z naszego folderu przesyłania. Napiszmy kod od razu.

Otwórz ponownie filesLogic.php i dodaj ten kod na końcu pliku:

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

}

Kiedy wymienialiśmy pliki, do każdego przycisku pobierania (a raczej linku do pobierania) był dołączony parametr o nazwie file_id. Tak więc po kliknięciu łącza pobierania pliku identyfikator tego pliku jest wysyłany na stronę filesLogic.php i jest przechwytywany przez ten fragment kodu, który właśnie dodaliśmy.

Następnie kod pobiera informacje o konkretnym pliku z bazy danych za pomocą parametru file_id, a następnie przechowuje informacje o pliku w zmiennej o nazwie $plik. Używając metody PHP file_exists() z pełną ścieżką do naszego pliku jako argumentem, sprawdzamy, czy plik rzeczywiście istnieje w naszym folderze przesyłania. Następnie przystępujemy do ustawienia niektórych nagłówków i wreszcie odpowiadamy plikiem użytkownikowi za pomocą funkcji readFile() w PHP.

Po pobraniu pliku aktualizujemy licznik pobrań dla tego konkretnego pliku w bazie danych.

Wniosek

To wszystko z przesyłaniem i pobieraniem plików. Możesz go dodatkowo dostosować, aby tworzyć fajne aplikacje PHP. Bardzo dziękuję za śledzenie. Daj mi znać, co myślisz o tym artykule w sekcji komentarzy poniżej, jeśli możesz.

Miłego czasu!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pobierz ostatnio wstawiony identyfikator za pomocą Mysql

  2. Jak najlepiej wykorzystać funkcję komentowania w MySQL?

  3. Migracja z Oracle do MySQL

  4. Funkcje agregujące MySQL bez klauzuli GROUP BY

  5. przyznaj zdalny dostęp do bazy danych MySQL z dowolnego adresu IP