PHP文件下载
- 文件下载
1 <?php 2 $fileName="tony.jpeg"; 3 //判断文件存在否,如果不存在,程序中断执行 4 if(!file_exists($fileName)){ 5 die("文件不存在"); 6 } 7 //打开文件 8 $fp=fopen($fileName,"r"); 9 //获取下载文件大小 10 $fileSize=filesize($fileName); 11 //下载文件需要的头 12 header("Content-type: application/octet-stream"); 13 header("Accept-Ranges: bytes"); 14 header("Accept-Length: $fileSize"); 15 //客户端弹出对话框,对应的文件名 16 header("Content-Disposition: attachment; filename=".$fileName); 17 //判断文件是否结束,回送数据 18 while(!feof($fp)){ 19 $contents=fread($fp,$fileSize); 20 echo $contents; 21 } 22 //关闭文件 23 fclose($fp); 24 ?>
IE8运行结果如下:
- 中文名文件下载,读取字节计数器
当文件名为中文时,会读取不到相应的文件,提示文件不存在,所以我们用iconv函数把utf-8转码成gb2312
1 <?php 2 //文件名为中文时,需要转码成gb2312显示 3 $fileName="老泪纵横.jpg"; 4 $fileName=iconv("utf-8","gb2312",$fileName); 5 //判断文件存在否,如果不存在,程序中断执行 6 if(!file_exists($fileName)){ 7 die("文件不存在"); 8 } 9 //打开文件 10 $fp=fopen($fileName,"r"); 11 //获取下载文件大小 12 $fileSize=filesize($fileName); 13 //下载文件需要的头 14 header("Content-type: application/octet-stream"); 15 header("Accept-Ranges: bytes"); 16 header("Accept-Length: $fileSize"); 17 //客户端弹出对话框,对应的文件名 18 header("Content-Disposition: attachment; filename=".$fileName); 19 //判断文件是否结束,回送数据 20 //为了安全,我们做一个文件读取字节计数器 21 $buffer=1024; 22 $fileCount=0; 23 while(!feof($fp)&&($fileSize-$fileCount)>0){ 24 $contents=fread($fp,$buffer); 25 //统计读了多少个字节 26 $fileCount+=$buffer; 27 //把部分数据回送给浏览器 28 echo $contents; 29 } 30 //关闭文件 31 fclose($fp); 32 ?>
IE8运行结果如下:
- 当下载文件与该php文件不在同一文件夹下时,用相对路径表示如下:
1 <?php 2 //文件名为中文时,需要转码成gb2312显示 3 $fileName="老泪纵横.jpg"; 4 $fileName=iconv("utf-8","gb2312",$fileName); 5 //相对路径表示文件位置 6 $filePath="./pictures/".$fileName; 7 //判断文件存在否,如果不存在,程序中断执行 8 if(!file_exists($filePath)){ 9 die("文件不存在"); 10 } 11 //打开文件 12 $fp=fopen($filePath,"r"); 13 //获取下载文件大小 14 $fileSize=filesize($filePath); 15 //下载文件需要的头 16 header("Content-type: application/octet-stream"); 17 header("Accept-Ranges: bytes"); 18 header("Accept-Length: $fileSize"); 19 //客户端弹出对话框,对应的文件名 20 header("Content-Disposition: attachment; filename=".$fileName); 21 //判断文件是否结束,回送数据 22 //为了安全,我们做一个文件读取字节计数器 23 $buffer=1024; 24 $fileCount=0; 25 while(!feof($fp)&&($fileSize-$fileCount)>0){ 26 $contents=fread($fp,$buffer); 27 //统计读了多少个字节 28 $fileCount+=$buffer; 29 //把部分数据回送给浏览器 30 echo $contents; 31 } 32 //关闭文件 33 fclose($fp); 34 ?>
IE8运行结果如下:
- 用绝对路径表示如下:
1 //绝对路径表示文件位置 2 $filePath=$SERVER['DOCUMENT_ROOT']."./pictures/".$fileName;
结果同上
- 用函数把上述程序封装
1 <?php 2 //对函数参数的说明: 3 //$fileName 文件名,格式为 "老泪纵横.jpg" 4 //$fileSubDir 下载文件的子路径,格式为 "./pictures/" 5 function fileDown($fileName,$fileSubDir){ 6 //文件名为中文时,需要转码成gb2312显示 7 $fileName=iconv("utf-8","gb2312",$fileName); 8 //相对路径表示文件位置 9 //$filePath="./pictures/".$fileName; 10 //绝对路径表示文件位置 11 $filePath=$SERVER['DOCUMENT_ROOT'].$fileSubDir.$fileName; 12 //判断文件存在否,如果不存在,程序中断执行 13 if(!file_exists($filePath)){ 14 die("文件不存在"); 15 } 16 //打开文件 17 $fp=fopen($filePath,"r"); 18 //获取下载文件大小 19 $fileSize=filesize($filePath); 20 //下载文件需要的头 21 header("Content-type: application/octet-stream"); 22 header("Accept-Ranges: bytes"); 23 header("Accept-Length: $fileSize"); 24 //客户端弹出对话框,对应的文件名 25 header("Content-Disposition: attachment; filename=".$fileName); 26 //判断文件是否结束,回送数据 27 //为了安全,我们做一个文件读取字节计数器 28 $buffer=1024; 29 $fileCount=0; 30 while(!feof($fp)&&($fileSize-$fileCount)>0){ 31 $contents=fread($fp,$buffer); 32 //统计读了多少个字节 33 $fileCount+=$buffer; 34 //把部分数据回送给浏览器 35 echo $contents; 36 } 37 //关闭文件 38 fclose($fp); 39 } 40 //调用函数 41 //fileDown("老泪纵横.jpg","./pictures/"); 42 fileDown("tony.jpeg",""); 43 ?>
- 页面上有多个文件可以选择下载
fileDownList.php 显示可以下载的文件:
1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <title>可下载文件列表</title> 5 </head> 6 <body> 7 <?php 8 //避免“点击下载”四个字乱码 9 header("Content-Type:text/html;charset=utf-8"); 10 ?> 11 <a href="fileDownProcess.php?fileName=hungry.jpg">点击下载</a><img src="pictures/hungry.jpg" width="70px" /><br/><br/> 12 <a href="fileDownProcess.php?fileName=tony.jpeg">点击下载</a><img src="pictures/tony.jpeg" width="70px" /><br/><br/> 13 <a href="fileDownProcess.php?fileName=老泪纵横.jpg">点击下载</a><img src="pictures/老泪纵横.jpg" width="70px" /><br/><br/> 14 <a href="fileDownProcess.php?fileName=hot.jpg">点击下载</a><img src="pictures/hot.jpg" width="70px" /><br/><br/> 15 <a href="fileDownProcess.php?fileName=smile.jpg">点击下载</a><img src="pictures/smile.jpg" width="70px" /><br/><br/> 16 </body> 17 </html>
fileDownProcess.php 完成文件下载:
1 <?php 2 require "fileDownService.php"; 3 header("Content-Type:text/html;charset=utf-8"); 4 //接收要下载文件的名字 5 $fileName=$_REQUEST['fileName']; 6 fileDown($fileName,"./pictures/"); 7 ?>
fileDownService.php 完成下载的函数封装:
1 <?php 2 //对函数参数的说明: 3 //$fileName 文件名,格式为 "老泪纵横.jpg" 4 //$fileSubDir 下载文件的子路径,格式为 "./pictures/" 5 function fileDown($fileName,$fileSubDir){ 6 //文件名为中文时,需要转码成gb2312显示 7 $fileName=iconv("utf-8","gb2312",$fileName); 8 //相对路径表示文件位置 9 //$filePath="./pictures/".$fileName; 10 //绝对路径表示文件位置 11 $filePath=$SERVER['DOCUMENT_ROOT'].$fileSubDir.$fileName; 12 //判断文件存在否,如果不存在,程序中断执行 13 if(!file_exists($filePath)){ 14 die("文件不存在"); 15 } 16 //打开文件 17 $fp=fopen($filePath,"r"); 18 //获取下载文件大小 19 $fileSize=filesize($filePath); 20 //下载文件需要的头 21 header("Content-type: application/octet-stream"); 22 header("Accept-Ranges: bytes"); 23 header("Accept-Length: $fileSize"); 24 //客户端弹出对话框,对应的文件名 25 header("Content-Disposition: attachment; filename=".$fileName); 26 //判断文件是否结束,回送数据 27 //为了安全,我们做一个文件读取字节计数器 28 $buffer=1024; 29 $fileCount=0; 30 while(!feof($fp)&&($fileSize-$fileCount)>0){ 31 $contents=fread($fp,$buffer); 32 //统计读了多少个字节 33 $fileCount+=$buffer; 34 //把部分数据回送给浏览器 35 echo $contents; 36 } 37 //关闭文件 38 fclose($fp); 39 } 40 ?>
结果如下:
鼠标点击“点击下载”,弹出如下框:
点击保存,会弹出保存路径可以选择,如下: