Skip to content

Commit c1d5e24

Browse files
committed
improve: download method on File.php
1 parent 0b17e39 commit c1d5e24

File tree

1 file changed

+39
-14
lines changed

1 file changed

+39
-14
lines changed

src/File.php

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -98,21 +98,46 @@ public static function runControllerFunction($dir_name,$class,$func)
9898
return $status;
9999
}
100100

101-
102-
public static function download($path,$download_name=null)
101+
102+
/**
103+
* Downloads a file from the server to the client with appropriate headers and content type.
104+
*
105+
* @param string $file_path The path of the file to download.
106+
* @param string|null $download_name The filename that will be shown in the download prompt. Defaults to the basename of the file_path if null.
107+
* @return void
108+
*/
109+
public static function download($file_path, $download_name = null)
103110
{
104-
if ($download_name==null) {
105-
$download_name=basename($path);
106-
}
107-
108-
header("Expires: 0");
109-
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
110-
header("Cache-Control: no-store, no-cache, must-revalidate");
111-
header("Cache-Control: post-check=0, pre-check=0", false);
112-
header("Pragma: no-cache"); header("Content-type: application/file");
113-
header('Content-length: '.filesize($path));
114-
header('Content-disposition: attachment; filename='.$download_name);
115-
readfile($path);
111+
// Load FileInfo module to determine the MIME type of the file
112+
$file_info = finfo_open(FILEINFO_MIME_TYPE);
113+
114+
if (is_file($file_path)) {
115+
$file_size = filesize($file_path);
116+
$download_name = $download_name ?? basename($file_path);
117+
118+
// Determine the content type based on the MIME type of the file
119+
$content_type = finfo_file($file_info, $file_path);
120+
121+
// Set headers for streaming
122+
header('Content-Type: ' . $content_type);
123+
header('Content-Transfer-Encoding: Binary');
124+
header('Content-Length: ' . $file_size);
125+
header('Content-disposition: attachment; filename="' . $download_name . '"');
126+
127+
// Open the file and stream it to the output buffer in small chunks
128+
$file = fopen($file_path, 'rb');
129+
while (!feof($file)) {
130+
print(fread($file, 1024 * 8));
131+
ob_flush();
132+
flush();
133+
}
134+
fclose($file);
135+
exit;
136+
} else {
137+
echo "Error: File not found.";
138+
}
139+
140+
finfo_close($file_info); // Close the FileInfo module
116141
}
117142

118143
public static function showImage($path)

0 commit comments

Comments
 (0)