Hướng dẫn php header download file

Download Zip file Download PDF file Download Image file Download EXE file

Click vào đường link trỏ đến tệp PDF hoặc tệp Image sẽ không tải file xuống máy tính.

Nó sẽ chỉ mở file trong trình duyệt. Sau đó bạn có thể lưu nó. Tuy nhiên, các tệp zip và exe thì được tự động tải xuống.

Chức năng Download file sử dụng PHP

Bạn có thể bắt buộc hình ảnh hoặc loại file khác tải trực tiếp xuống máy tính của người dùng bằng hàm readfile[] của PHP.

Ở đây chúng ta sẽ tạo một bộ sưu tập 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ú click chuột.

Hãy tạo một tệp có tên ‘image-gallery.php’ và đặt đoạn mã sau vào trong nó.





Simple Image Gallery

    .img-box{
        display: inline-block;
        text-align: center;
        margin: 0 15px;
    }



    

Nếu bạn xem mã ví dụ trên một cách cẩn thận, bạn sẽ thấy liên kết tải xuống dẫn đến file ‘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 ta đã sử dụng hàm urlencode[] của PHP để mã hóa tên tệp hình ảnh để nó có thể được truyền an toàn dưới dạng tham số URL, bởi vì tên tệp có thể chứa các ký tự không an toàn.

Đây là mã hoàn chỉnh của tệp ‘download.php‘ để bắt buộc tải xuống hình ảnh.

Ủa, chỉ có nhiêu đó thôi à? Đúng vậy, chỉ có vỏn vẹn 10 dòng là có được 1 chương trình download manager đơn giản [dĩ nhiên là chương trình này chỉ cho phép download được mỗi 1 file document.zip, ta còn phải làm việc nhiều để cho chương trình hoàn thiện hơn!].
Đầu tiên, ta mở file document.zip để đọc ở chế độ nhị phân [binary]:

PHP Code:

$fp fopen[$filename"rb"];.  

Tiếp theo ta báo cho browser biết data trả về từ server là dữ liệu nhị phân chứ không phải là văn bản HTMl như thông thường:

PHP Code:

header["Content-type: application/octet-stream"];  

.
Đồng thời ta cũng báo cho browser biết dung lượng của file sẽ được tải xuống:

PHP Code:

header["Content-length: " filesize[$filename]];  

.
Và cuối cùng là đọc nội dung file và echo lại cho browser download:

.
Lệnh fpassthru[$fp]; tương đương với 2 lệnh:

PHP Code:

$content fread[$handlefilesize[$filename]];
echo 
$content;  

Như vậy chương trình này cũng không có gì khác với các chương trình PHP thông thường ngoài 2 lệnh header[]. Trong đó lệnh

PHP Code:

header["Content-length: " filesize[$filename]];  

cũng không có gì là khó hiểu, lệnh này báo cho browser biết dung lượng của file chuẩn bị download [thực ra không có lệnh này thì quá trình download vẫn diễn ra như bình thường]. Vấn đề mấu chốt nằm ở lệnh

PHP Code:

header["Content-type: application/octet-stream"];  

.
Lệnh

PHP Code:

header["Content-type: application/octet-stream"];  

sẽ báo cho browser biết là dữ liệu chuẩn bị load xuống là dữ liệu nhị phân. Vì là dữ liệu nhị phân nên browser sẽ thực hiện quá trình download và save file thay vì hiển thị lên browser như là 1 trang HTML thông thường.
Thử chạy ví dụ trên vài lần, thay thế file document.zip bằng một số file khác nhau [ví dụ file Word, PDF, Excel...] và thử trên vài browser khác nhau, bạn sẽ nhận thấy có vài chỗ hơi khó chịu: 

  • Browser sẽ mặc định lưu file lên đĩa với tên là download.php. Bạn phải đổi tên file lại cho đúng trước khi mở file ra đọc.
  • Trong một số trường hợp, thay vì hỏi save file lên đĩa, browser sẽ mở luôn file [ví dụ chạy Word hoặc Acrobat mở luôn file vừa được download].

Để giải quyết 2 vấn đề khó chịu trên cũng không có gì khó khăn lắm, ta chỉ cần thêm 1 lệnh header[] nữa:

PHP Code:

header['Content-disposition: attachment; filename="'.$filename.'"'];  

Tham số "attachment" của header "Content-disposition" sẽ báo cho browser biết là nên download và save file thay vì open. Tham số "filename=" sẽ báo cho browser biết tên của file đang được download. CẢI TIẾN CHƯƠNG TRÌNH
Cho tới bây giờ chương trình của chúng ta vẫn còn thô sơ, chúng ta vẫn cần them vào chức năng nữa để chương trình hoàn thiện hơn. 

  • Cho phép người dùng chọn file để download. Hiện tại chương trình của chúng ta chỉ mới cho phép download 1 file duy nhất.
  • Kiểm tra dữ liệu nhập từ người dùng. Đây là một việc luôn nên làm. Chương trình cho phép nguời dùng chọn file để download thì cũng cần nên kiểm tra kỹ kẻo chính file config, file source hoặc file password của bạn bị download thì phiền.

Cho phép người dùng chọn file để download: Thao tác này có lẽ khá đơn giản đối với bạn. Chương trình sẽ nhận vào tham số file từ URL [ví dụ: download.php?file=document.zip]. Đoạn code xử lý như sau: 

PHP Code:

$filename = isset[$_GET['file']]?$_GET['file']:'';  

---------------------------------------------------------------
-------------------> BỔ SUNG BÀI VIẾT

Chủ Đề