十,PHP下载文件

1,文件类型

(1)文本文件,如xx.txt。

(2)二进制文件,如图片、视频、音频。

2,文件下载流程如下图所示,首先浏览器向服务器发送下载请求,服务器将下载资源读入内存,再通过http将资源返回到指定的目录。

3,下载具体代码如下:

function down_file($file_name, $file_sub_dir){
//    $file_name="se.jpg";
//php文件系统默认是gb2312,我们现在通用的utf-8,因此需要把文件名转化为gb2312
    $file_name = iconv("utf-8","GB2312",$file_name);

    $file_path = $_SERVER['DOCUMENT_ROOT'].$file_sub_dir.$file_name;
//    $file_path = $_SERVER['DOCMENT_ROOT']."/images/".$file_name;

//1。打开文件
    if(!file_exists($file_path)){
        echo "文件不存在!";
        return;
    }
    $fp = fopen($file_path,"r");

    $file_size = filesize($file_path);

    if($file_size > 1024*10*1024){   //限制下载大文件,10M
//        echo "文件过大,不能下载";
        echo "<script language='javascript'>window.alert('文件太大,不提供下载服务!');</script>";
        return;
    }

//返回的文件
    header("Content-type:application/octet-stream");
//按照字节大小返回
    header("Accept-Ranges:bytes");
//返回文件大小
    header("Accept-Length:$file_size");
//这里客户端的弹出对话框,对应的文件名
    header("Content-Disposition:attachment;filename=".$file_name);

//向客户端回送数据,分次传送
    $buffer = 1024;
    $file_count = 0;
    while(!feof($fp) && ($file_size-$file_count > 0)){
        $file_data = fread($fp,$buffer);
        $file_count += $buffer;
        echo $file_data;
    }
    fclose($fp);
}

down_file("se.jpg", "/blog/webroot/images/");

  注意:(1)php的文件系统比较旧,用的字符编码是gb2312,现在大部份文件是utf-8编码,因此需要对文件名进行转码,将utf-8转化为gb2312:

$file_name = iconv("utf-8","GB2312",$file_name);

(2)文件路径用绝对路径,也可以使用相对路径,绝对路径效率更高,

$file_path = $_SERVER['DOCUMENT_ROOT'].$file_sub_dir.$file_name;

php相对路径表示,比如代码页a.php,同目录下有个文件夹image,文件夹中有b.jpg,那么a.php;利用相对路径引用b.jpg时候

$file_path = "./image/b.jpg";

如果image和a.php的父目录同级别,

$file_path = "./../image/b.jpg";

4,网页禁止某个ip访问,

if($_SERVER['REMOTE_ADDR'] == "192.168.1.100"){
    echo "禁止你访问!";
}

5,防盗链技术,网站中某些网页希望登陆之后查看,

<?php
/**
 * Created by PhpStorm.
 * User: usa007lhy
 * Date: 2015/10/18
 * Time: 19:54
 */
if(isset($_SERVER['HTTP_REFERER'])){
    if(strpos($_SERVER['HTTP_REFERER'],"http://localhost/http") == 0){
        echo "韩顺平的账号信息...";
    }else{
        header("Location:warning.php");
    }
}else{
    header("Location:warning.php");
}
?>
原文地址:https://www.cnblogs.com/usa007lhy/p/4888120.html