PHP Cơ bản
PHP Nâng cao
PHP & Cơ sở dữ liệu MySQL
Ví dụ PHP
Tài liệu tham khảo PHP
Quảng cáo

Tải xuống tệp bằng PHP

Trong hướng dẫn này, bạn sẽ học cách buộc tải xuống một tệp bằng PHP.

Tải xuống tệp 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 zip, tài liệu pdf, tệp exe, v.v. Nếu loại tệp đó đượ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 đó 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 đó.

Ví dụ

<a href="downloads/test.zip">Download Zip file</a>
<a href="downloads/masters.pdf">Download PDF file</a>
<a href="downloads/sample.jpg">Download Image file</a>
<a href="downloads/setup.exe">Download EXE file</a>

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

Buộc tải xuống bằng PHP

Bạn có thể buộc hình ảnh hoặc các loại tệp khác tải 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 tôi 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 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 có tên "image-gallery.php" và đặt đ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 ả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 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 "download.php", URL cũng chứa tên tệp hình ảnh dưới dạng chuỗi truy vấn. Ngoài ra, chúng tôi đã sử dụng hàm urlencode() trong PHP để mã hóa tên tệp 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 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 "download.php", bắt buộc 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 không hợp lệ!");
    }
}
?>

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

Xem ví dụ cụ thể tại Download tệp 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 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 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 về biểu thức chính quy.

Bài viết này đã giúp ích cho bạn?

Advertisements