简单的示例代码:
function downloadFile($filePath) { set_time_limit(0); if (substr($filePath, strlen($filePath) - 1) == '/') { $filePath = substr($filePath, 0, strlen($filePath) - 1); } if (!is_file($filePath) && !is_readable($filePath)) { return false; } $obj = new SplFileInfo($filePath); header('Content-Type: application/octet-stream'); header('Accept-Ranges:bytes'); header('Content-Length:' . filesize($filePath)); //注意是'Content-Length:' 非Accept-Length header('Content-Disposition:attachment;filename=' . $obj->getFilename());//声明作为附件处理和下载后文件的名称 $buffer = 1024; ob_clean(); $handle = fopen($filePath, 'rb'); while (!feof($handle)) { echo fread($handle, $buffer); } flush(); fclose($handle); exit; }
主要是设置header头:
文件类型:Content-Type: application/octet-stream
字节流:Accept-Ranges:bytes
长度:Content-Length:>0
声明作为附件处理和下载后文件的名称:
Content-Disposition:attachment;filename=FILENAME
*最重要的是 ob_clean();跟flush();
如果没有这两个函数,有可能下载下来的文件就是损坏的。