php实现文件下载的几种方式
本文简单介绍在PHP中几种常用文件下载方式。一、直接链接文件下载在知道文件路径的情况下,可以简单的通过页面“a”标签元素,直接下载文件。 代码如下:<!DOCTYPEhtml><htmllang="en"><head><basetarget="_self"><metahttp-equiv="Content-Type"content="text/
·
一、直接链接文件下载
在知道文件路径的情况下,可以简单的通过页面“a”标签元素,直接下载文件。 代码如下:
<!DOCTYPE html> <html lang="en"> <head> <base target="_self"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache,must-ridate"> <meta http-equiv="expires" content="0"> </head> <body> <a href="down.rar">下载文件</a> </body> </html>
二、根据参数动态查找并跳转到下载链接
通常情况下,文件名是变动的,需要根据指定条件计算出文件名。此时可以在后台根据变量参数,动态计算查找到文件并跳转到下载链接。前端代码如下:
<!DOCTYPE html> <html lang="en"> <head> <base target="_self"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache,must-ridate"> <meta http-equiv="expires" content="0"> </head> <body> <a href="index.php?filename=down">下载文件</a> </body> </html>
后台代码如下:
<?php $down = $_GET['filename']; // 获取文件参数 $filename = $down . '.rar'; // 构造文件名称 $dir = "/"; // 相对于网站根目录的下载目录路径 $down_host = $_SERVER['HTTP_HOST']; // 当前域名 // 如果文件存在,则跳转到下载路径 if (file_exists(__DIR__ . '/' . $dir . $filename)) { header('location:http://' . $down_host . $dir . $filename); } else { header('HTTP/1.1 404 Not Found'); }
文件存在时,点击“下载文件”即可正常下载文件。否则会提示404文件不存在,如下图
三、使用fread()函数把文件直接输出到浏览器
除了通过文件名下载,我们也可以在后台通过fread方法,读出文件内容,然后将文件内容以流的方式直接输出到浏览器。代码如下:
<?php $file_name = "down.rar"; // 下载文件名 $file_dir = "./"; // 下载文件存放目录 // 检查文件是否存在 if (!file_exists($file_dir . $file_name)) { header('HTTP/1.1 404 NOT FOUND'); } else { // 以只读和二进制模式打开文件 $file = fopen($file_dir . $file_name, "rb"); // 告诉浏览器这是一个文件流格式的文件 Header("Content-type: application/octet-stream"); // 请求范围的度量单位 Header("Accept-Ranges: bytes"); // Content-Length是指定包含于请求或响应中数据的字节长度 Header("Accept-Length: " . filesize($file_dir . $file_name)); // 用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。 Header("Content-Disposition: attachment; filename=" . $file_name); // 读取文件内容并直接输出到浏览器 echo fread($file, filesize($file_dir . $file_name)); fclose($file); exit (); }
总结:
第一个和第二个操作比较简单,但是容易暴露文件的真实地址,安全性不高。第三种能够较好的把文件的真实地址隐藏起来。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献11条内容
所有评论(0)