方法一,采用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 ); } |
© 版权声明
文章版权归作者所有,未经允许请勿转载。