04/10/2018, 18:01

Ép download file bằng PHP

Thông thường, khi chúng ta tạo chức năng download một file hình ảnh ( gif, png, jpg etc. ) hoặc file có đuôi .csv , .pdf hoặc .php thì chúng sẽ được mở trong trình duyệt với tab hay cửa sổ mới mà không xuất hiện hộp thoại download. Trong bài viết này, mình sẽ chia sẻ cho các bạn một ...

Thông thường, khi chúng ta tạo chức năng download một file hình ảnh ( gif, png, jpg etc. ) hoặc file có đuôi .csv, .pdf  hoặc .php thì chúng sẽ được mở trong trình duyệt với tab hay cửa sổ mới mà không xuất hiện hộp thoại download.

force-to-download-a-file-in-php

Trong bài viết này, mình sẽ chia sẻ cho các bạn một đoạn code bằng PHP,giúp cho các bạn có thể ép những file mà mình nêu bên trên có thể download được chỉ bằng việc click vào nó mà không cần phải hiển thị ở một tab hay cửa sổ mới trên trình duyệt.

Giả sử các bạn tạo một file mới với tên gọi là function.php, sau đó các bạn cần copy đoạn code sau  và dán vào bên trong nó :

function output_file($Source_File, $Download_Name, $mime_type=')
{
/*
$Source_File = path to a file to output
$Download_Name = filename that the browser will see
$mime_type = MIME type of the file (Optional)
*/
if(!is_readable($Source_File)) die('File not found or inaccessible!');
 
$size = filesize($Source_File);
$Download_Name = rawurldecode($Download_Name);
 
/* Figure out the MIME type (if not specified) */
$known_mime_types=array(
    "pdf" => "application/pdf",
    "csv" => "application/csv",
    "txt" => "text/plain",
    "html" => "text/html",
    "htm" => "text/html",
    "exe" => "application/octet-stream",
    "zip" => "application/zip",
    "doc" => "application/msword",
    "xls" => "application/vnd.ms-excel",
    "ppt" => "application/vnd.ms-powerpoint",
    "gif" => "image/gif",
    "png" => "image/png",
    "jpeg"=> "image/jpg",
    "jpg" =>  "image/jpg",
    "php" => "text/plain"
);
 
if($mime_type=='){
     $file_extension = strtolower(substr(strrchr($Source_File,"."),1));
     if(array_key_exists($file_extension, $known_mime_types)){
        $mime_type=$known_mime_types[$file_extension];
     } else {
        $mime_type="application/force-download";
     };
};
 
@ob_end_clean(); //off output buffering to decrease Server usage
 
// if IE, otherwise Content-Disposition ignored
if(ini_get('zlib.output_compression'))
  ini_set('zlib.output_compression', 'Off');
 
header('Content-Type: ' . $mime_type);
header('Content-Disposition: attachment; filename="'.$Download_Name.'"');
header("Content-Transfer-Encoding: binary");
header('Accept-Ranges: bytes');
 
header("Cache-control: private");
header('Pragma: private');
header("Expires: Thu, 26 Jul 2012 05:00:00 GMT");
 
// multipart-download and download resuming support
if(isset($_SERVER['HTTP_RANGE']))
{
    list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2);
    list($range) = explode(",",$range,2);
    list($range, $range_end) = explode("-", $range);
    $range=intval($range);
    if(!$range_end) {
        $range_end=$size-1;
    } else {
        $range_end=intval($range_end);
    }
 
    $new_length = $range_end-$range+1;
    header("HTTP/1.1 206 Partial Content");
    header("Content-Length: $new_length");
    header("Content-Range: bytes $range-$range_end/$size");
} else {
    $new_length=$size;
    header("Content-Length: ".$size);
}
 
/* output the file itself */
$chunksize = 1*(1024*1024); //you may want to change this
$bytes_send = 0;
if ($Source_File = fopen($Source_File, 'r'))
{
    if(isset($_SERVER['HTTP_RANGE']))
    fseek($Source_File, $range);
 
    while(!feof($Source_File) &&
        (!connection_aborted()) &&
        ($bytes_send<$new_length)
          )
    {
        $buffer = fread($Source_File, $chunksize);
        print($buffer); //echo($buffer); // is also possible
        flush();
        $bytes_send += strlen($buffer);
    }
fclose($Source_File);
} else die('Error - can not open file.');
 
die();
}
?>

Và để sử dụng, các bạn dùng như sau :

include("function.php");
set_time_limit(0);  
$file_path="phpgang.csv";
output_file($file_path, 'phpgang.csv', 'application/csv');
?>

Trong đoạn code trên, mỗi khi cần “ép” download file nào, thì các bạn chỉ việc thay đổi giá trị của biến $file_path  và tham số thứ 2 của hàm output_file là xong.

Chúc các bạn thành công !

Tags: code Snipppets download

Chuyên Mục: PHP

Bài viết được đăng bởi webmaster

Bài liên quan

Ép download file bằng PHP

Thông thường, khi chúng ta tạo chức năng download một file hình ảnh ( gif, png, jpg etc. ) hoặc file có đuôi .csv , .pdf hoặc .php thì chúng sẽ được mở trong trình duyệt với tab hay cửa sổ mới mà không xuất hiện hộp thoại download. Trong bài viết này, mình sẽ chia sẻ cho các bạn một ...

Hoàng Hải Đăng viết 18:01 ngày 04/10/2018

Đếm số lượng file có trong đường dẫn (Directory) bằng PHP

Hôm nay mình sẽ chia sẻ cho các bạn 2 đoạn code giúp các bạn có thể xử lý khi làm việc với đường dẫn (Directory), có thể hiện giờ các bạn không dùng nó trên trang web của mình, nhưng mình tin rằng một ngày nào đó các bạn sẽ có dịp dùng đến nó, còn không thì các bạn cũng có thể học hỏi thêm được ...

Vũ Văn Thanh viết 17:58 ngày 04/10/2018

Upload và giải nén file zip trực tiếp trên web server bằng PHP

Hôm nay mình sẽ cùng với các bạn viết một ứng dụng nhỏ bằng PHP, trong ứng dụng này, chúng ta sẽ tạo một chức năng upload file zip, và file zip này sẽ tự động được giải nén ngay khi nó được up lên web server. Khi file zip được upload lên , chương trình sẽ tự động tạo một folder cùng tên với file ...

Hoàng Hải Đăng viết 17:47 ngày 04/10/2018

Hướng dẫn gửi mail với file đính kèm (Attachment) bằng PHP

Gửi mail thì chắc hẳn là ai cũng biết, nhưng gửi mail kèm với file đính kèm như một file word, hoặc 1 hình ảnh nào đó thì sẽ không ít người chưa từng làm qua. Nếu bạn đam mê lập trình bằng PHP thì đây là đoạn code mà theo mình nghĩ bạn không nên bỏ qua, nó sẽ rất có ích cho bạn trong những dự ...

Bùi Văn Nam viết 17:44 ngày 04/10/2018

Code download manager đơn giản bằng PHP

Có lẽ cũng không cần giới thiệu nhiều về nhu cầu "giấu diếm" này vì hiện nay có khá nhiều site sử dụng cách quản lý download như vậy và cũng có số lượng cũng nhiều không kém các site mới muốn tìm hiểu và sử dụng nó ;-) Tuy nhiên, có lẽ không thừa nếu như chúng ta tìm hiểu kỹ hơn một chút ...

Tạ Quốc Bảo viết 18:09 ngày 02/10/2018
0