Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách tải lên và tải xuống các tệp PHP và MySQL

Hướng dẫn này trình bày cách bạn có thể tải lên các tệp có nhiều định dạng khác nhau bao gồm .zip, .pdf, .docx, .ppt, cũng như các tệp hình ảnh thông qua biểu mẫu sử dụng PHP để được lưu trữ trong một thư mục trên máy chủ của chúng tôi.

Chúng tôi cũng sẽ ghi lại tên của các tệp đã tải lên và thông tin liên quan như tên tệp, kích thước và số lượng tải xuống trong bảng cơ sở dữ liệu.

Tạo một thư mục dự án PHP mới và gọi nó là tệp-tải lên-tải xuống. Tạo một thư mục con bên trong thư mục này có tên là các tệp tải lên (đây là nơi các tệp đã tải lên của chúng tôi sẽ được lưu trữ) và một tệp có tên là index.php.

index.php là nơi chúng tôi sẽ tạo biểu mẫu tải lên tệp của mình. Mở nó ra và đặt mã này vào bên trong nó:

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>

Đó là một biểu mẫu rất đơn giản chỉ lấy trường nhập cho tệp của chúng tôi và một nút tải lên.

Trong phần head, chúng tôi đang liên kết đến tệp style.css của chúng tôi để cung cấp một số kiểu cho biểu mẫu của chúng tôi. Tạo tệp đó trong thư mục gốc của ứng dụng của chúng tôi và thêm mã CSS này vào tệp đó:

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 index.php, chúng tôi đang bao gồm tệp filesLogic.php. Đây là tệp chứa tất cả logic nhận tệp đã gửi của chúng tôi và lưu vào thư mục tải lên cũng như lưu trữ thông tin tệp trong cơ sở dữ liệu. Hãy tạo tệp này ngay bây giờ.

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

Ở đầu tệp này, chúng tôi đang kết nối với cơ sở dữ liệu nhưng chúng tôi chưa tạo nó. Hãy làm điều đó ngay bây giờ.

Tạo một cơ sở dữ liệu mới được gọi là quản lý tệp. Trong cơ sở dữ liệu này, hãy tạo một bảng có tên là tệp và cung cấp cho nó các trường sau.

  • id - INT
  • tên - VARCHAR (255)
  • kích thước - INT
  • tải xuống

Bây giờ hãy mở tệp index.php trong trình duyệt của bạn. Đối với tôi, tôi sẽ truy cập http://localhost/file-upload-download/download.php.

Nhấp vào trường nhập tệp và chọn bất kỳ tệp nào từ máy của bạn để tải lên.

Lưu ý:Tùy thuộc vào cấu hình php của bạn, tệp của bạn có thể không tải lên được nếu kích thước vượt quá giá trị upload_max_filesize được đặt trong tệp php.ini của bạn. Bạn luôn có thể định cấu hình thông tin này trong tệp php.ini của mình. Tăng giá trị của post_max_size và upload_max_filesize.

Sau khi chọn tệp của bạn, bạn có thể nhấp vào nút tải lên. Nếu mọi thứ suôn sẻ, tệp của bạn sẽ được tải lên thư mục tải lên trong dự án của bạn và một bản ghi mới sẽ được tạo trong bảng tệp trong cơ sở dữ liệu có chứa tên tệp, kích thước và số lượt tải xuống.

Bây giờ tệp của chúng tôi đã được tải lên. Bạn có thể kiểm tra thư mục tải lên và bảng cơ sở dữ liệu để xác nhận rằng nó đã thành công. Hãy hiển thị nó để người dùng có thể xem và nhấp vào nó để tải xuống. Đầu tiên, chúng ta cần tìm nạp thông tin tệp từ cơ sở dữ liệu.

Mở filesLogic.php và thêm 3 dòng mã này ngay dưới dòng nơi chúng tôi kết nối với cơ sở dữ liệu:

<?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);

Thao tác này chọn tất cả thông tin tệp từ cơ sở dữ liệu và đặt nó thành một biến mảng có tên là $ files.

Bây giờ, hãy tạo một tệp có tên là Download.php trong thư mục gốc của ứng dụng của chúng tôi và thêm mã này vào bên trong nó:

Download.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>

Bây giờ trên trang này, thông tin tệp từ cơ sở dữ liệu được liệt kê từng tệp cùng với kích thước tính bằng KB và số lượt tải xuống. Ngoài ra còn có một nút tải xuống đối với mỗi tệp. Những gì còn lại bây giờ là mã thực sự tải xuống tệp từ thư mục tải lên của chúng tôi. Hãy viết mã ngay lập tức.

Mở lại filesLogic.php và thêm mã này vào cuối tệp:

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

}

Khi chúng tôi liệt kê các tệp, mỗi nút tải xuống (hay đúng hơn là liên kết tải xuống) có một tham số được gọi là file_id được đính kèm với nó. Vì vậy, khi bạn nhấp vào liên kết tải xuống của một tệp, id của tệp đó sẽ được gửi đến trang filesLogic.php và được lấy bởi đoạn mã này mà chúng ta vừa thêm vào bây giờ.

Sau đó, mã tìm nạp thông tin tệp cụ thể đó từ cơ sở dữ liệu bằng cách sử dụng tham số file_id và sau đó lưu trữ thông tin tệp trong một biến có tên là $ tệp. Sử dụng phương thức file_exists () của PHP với đường dẫn đầy đủ đến tệp của chúng tôi làm đối số, chúng tôi kiểm tra xem tệp có thực sự tồn tại trong thư mục tải lên của chúng tôi hay không. Sau đó, chúng tôi tiến hành đặt một số tiêu đề và cuối cùng trả lời tệp cho người dùng bằng cách sử dụng hàm readFile () trong PHP.

Sau khi tệp được tải xuống, chúng tôi cập nhật số lượt tải xuống cho tệp cụ thể đó trong cơ sở dữ liệu.

Kết luận

Đó là về nó với tải lên và tải xuống tệp. Bạn có thể tùy chỉnh thêm nó để xây dựng các ứng dụng PHP thú vị. Cảm ơn rất nhiều vì đã theo dõi. Hãy cho tôi biết bạn nghĩ gì về bài viết này trong phần bình luận bên dưới, nếu bạn vui lòng.

Chúc bạn có một khoảng thời gian vui vẻ!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. localhost so với 127.0.0.1 trong mysql_connect ()

  2. Làm cách nào để thay đổi kiểu dữ liệu cho một cột trong MySQL?

  3. CURRENT_TIME Ví dụ - MySQL

  4. Cách sử dụng mật khẩu gốc với MySQL 5.7

  5. Làm thế nào để kiểm tra xem một chuỗi có phải là JSON hay không?