Download File - PHP

Trong bài hướng dẫn này, bạn sẽ được học cách download một file bằng PHP.

Tải tập tin bằng PHP

Thông thường, bạn không nhất thiết phải sử dụng bất kỳ ngôn ngữ kịch bản phía máy chủ nào như PHP để tải xuống hình ảnh, tập tin zip, tài liệu pdf, tập tin exe,... Nếu loại tập tin đó được lưu trữ trong một thư mục có thể truy cập công cộng (public), bạn có thể tạo một siêu liên kết trỏ đến tập tin đó và bất cứ khi nào người dùng nhấp vào liên kết, trình duyệt sẽ tự động tải xuống tập tin đó.

Ví dụ

<a href="downloads/link_test.zip">Download Zip file</a>
<a href="downloads/link_masters.pdf">Download PDF file</a>
<a href="downloads/link_sample.jpg">Download Image file</a>
<a href="downloads/link_setup.exe">Download EXE file</a>

Nhấp vào liên kết trỏ đến tập tin PDF hoặc tập tin Hình ảnh sẽ không tải trực tiếp tập tin đó xuống ổ cứng của bạn. Nó sẽ chỉ mở tập tin trong trình duyệt của bạn. Bạn có thể lưu nó vào ổ cứng của mình. Tuy nhiên, các tập tin zip và exe được tải xuống tự động vào ổ cứng theo mặc định.

Bắt buộc download bằng PHP

Bạn có thể bắt buộc hệ thống phải tải xuống cả hình ảnh hoặc các loại tập tin khác trực tiếp vào ổ cứng của người dùng bằng cách sử dụng hàm readfile() trong PHP. Ở đây, chúng ta sẽ tạo một thư viện hình ảnh đơn giản cho phép người dùng tải xuống các tập tin hình ảnh từ trình duyệt chỉ bằng một cú nhấp chuột.

Hãy tạo một tập tin có tên "image-gallery.php" và copy đoạn mã sau vào bên trong nó.

Ví dụ

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Thư viện hình ảnh</title>
<style type="text/css">
    .img-box{
        display: inline-block;
        text-align: center;
        margin: 0 15px;
    }
</style>
</head>
<body>
    <?php
    // Array containing sample image file names - Mảng chứa tên tập tin hình ảnh mẫu
    $images = array("kites.jpg", "balloons.jpg");
    
    // Loop through array to create image gallery - Lặp qua mảng để tạo thư viện hình ảnh
    foreach($images as $image){
        echo '<div class="img-box">';
            echo '<img src="images/' . $image . '" width="200" alt="' .  pathinfo($image, PATHINFO_FILENAME) .'">';
            echo '<p><a href="download.php?file=' . urlencode($image) . '">Tải xuống</a></p>';
        echo '</div>';
    }
    ?>
</body>
</html>

Nếu bạn xem kỹ đoạn mã ví dụ trên, bạn sẽ tìm thấy liên kết tải xuống là liên kết tới tập tin "download.php", URL cũng chứa tên tập tin hình ảnh dưới dạng chuỗi truy vấn. Ngoài ra, chúng ta đã sử dụng hàm urlencode()  trong PHP để mã hóa tên tập tin hình ảnh để nó có thể được chuyển một cách an toàn dưới dạng tham số URL, vì tên tập tin có thể chứa các ký tự không an toàn cho URL.

Đây là mã hoàn chỉnh của tập tin "download.php", bắt buộc phải tải xuống hình ảnh.

Ví dụ

<?php
if (isset($_REQUEST["file"])) {
    // Get parameters - Nhận thông số
    $file = urldecode($_REQUEST["file"]); // Decode URL-encoded string - Giải mã chuỗi mã hóa URL

    /* Test whether the file name contains illegal characters
       such as "../" using the regular expression 
       Kiểm tra xem tên tệp có chứa các ký tự không hợp lệ hay không
      chẳng hạn như "../" bằng cách sử dụng biểu thức chính quy*/
    if (preg_match('/^[^.][-a-z0-9_.]+[a-z]$/i', $file)) {
        $filepath = "images/" . $file;

        // Process download - Xử lý tải xuống
        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($filepath));
            flush(); // Flush system output buffer
            readfile($filepath);
            die();
        } else {
            http_response_code(404);
	        die();
        }
    } else {
        die("Tên tập tin không hợp lệ!");
    }
}
?>

Tương tự, các bạn có thể bắt buộc phải tải xuống các định dạng tập tin khác như tập tin word doc, tập tin pdf,...

Xem ví dụ cụ thể tại Download tập tin tin trong PHP

Biểu thức chính quy trong ví dụ ở trên ( dòng số 10 ):  if(preg_match('/^[^.][-a-z0-9_.]+[a-z]$/i', $file)){ sẽ không cho phép những tập tin có tên bắt đầu hoặc kết thúc bằng ký tự dấu chấm ( . ), ví dụ: nó cho phép các tên tập tin như kites.jpg hoặc Kites.jpg, myscript.min.js nhưng không cho phép kites.jpg. hoặc .kites.jpg.

Vui lòng xem hướng dẫn về biểu thức chính quy để tìm hiểu chi tiết hơn về biểu thức chính quy.

 

Bài viết mới cập nhật