php实现文件下载的几种方式

  本文简单介绍在PHP中几种常用文件下载方式。

    一、直接链接文件下载

    在知道文件路径的情况下,可以简单的通过页面“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文件不存在,如下图

    1-20110411544H96.png

    三、使用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 ();
}

    总结:

    第一个和第二个操作比较简单,但是容易暴露文件的真实地址,安全性不高。第三种能够较好的把文件的真实地址隐藏起来。

  • 9
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值