文章摘要
这篇文章介绍了两种文件下载方法,分别适用于不同的场景。第一种方法使用`fread()`函数切片下载,适合大流量下载。它可以通过设置限速来控制下载速度,但需要注意避免内存溢出和下载失败。第二种方法不限速、不限制切片,适合小文件下载,操作更为简便。文章还提到了文件名生成、Content-Disposition头设置以及如何控制文件长度等技术细节。
方法一,采用fread()函数切片下载,适合大流量下载。可以限速下载,但容易导致内存溢出,下载失败。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | public function fileUrl($url){ $file = 'uploads/files/'.$url; if (file_exists(\dirname(__FILE__).$file)) { return $this->error("文件不存在"); } // 新文件名 $filename = explode('.', $file); $filename = array_pop($filename); $filename = time().'.'.$filename; //下载文件 $filesize = filesize($file) + 1000; header('Content-Description:File Transfer'); header("Content-Type:application/octet-stream"); header('Content-Transfer-Encoding:binary'); header("Accept-Ranges: bytes"); header('Expires:0'); header('Cache-Control:must-revalidate'); header('Pragma:public'); header("Content-Length:".$filesize); header("Content-Disposition:attachment;filename=".$filename); $fp = fopen($file, "rb"); fseek($fp,0); while (!feof($fp)) { set_time_limit(0); print (fread($fp, 1024 * 8)); flush(); ob_flush(); } fclose($fp); exit ();} |
方法二,不限速不切片无限制的形势下载,适合小文件下载。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public function fileUrl2($url){ $file = 'uploads/files/'.$url; if (file_exists(\dirname(__FILE__).$file)) { return $this->error("文件不存在"); } // 新文件名 $filename = explode('.', $file); $filename = array_pop($filename); $filename = time().'.'.$filename; header('Content-type:application/octet-stream'); header('Content-Disposition:attachment;filename='.$filename); header('Content-Length:'.filesize($file)); readfile($file);} |
© 版权声明
文章版权归作者所有,未经允许请勿转载。



