PHP中文名文件下载实现

php下载文件的流程:

其实就是给予一个链接:  <href="指向处理文件的地址"></a> 这样,当前端点击链接的时候,指向处理文件,比如download.php

本例题 在download.php同级目录下有resume.docx文件

<?php
    $file_name = 'resume.docx';
    $file_sub_path =$_SERVER['DOCUMENT_ROOT'].__ROOT__.'/Public/Download/';
    $file_path = $file_sub_path.$file_name;
    if (!file_exists($file_path)){  //判断文件是否存在
        echo "文件不存在";
        exit();
    }
    $fp = fopen($file_path,"r+"or die('打开文件错误');   //下载文件必须要将文件先打开。写入内存
    $file_size = filesize($file_path);
    Header("Content-type:application/octet-stream");
    //按照字节格式返回
    Header("Accept-Ranges:bytes");
    //返回文件大小
    Header("Accept-Length:".$file_size);
    //弹出客户端对话框,对应的文件名
    Header("Content-Disposition:attachment;filename=".$file_name);
    //防止服务器瞬间压力增大,分段读取
    $buffer = 1024;
    while(!feof($fp)){
        $file_data = fread($fp,$buffer);
        echo $file_data;
    }
    fclose($fp);
}

知识点:

$_SERVER['DOCUMENT_ROOT'] 服务器的根路径,比如我的电脑上是 d:wamp/www

__ROOT__是THINKPHP中的用法,指向项目的根路径,比如我的电脑是/tpblog

$file_sub_path 指向,所需要下载文件的路径 d:wamp/www/tpblog/Public/Download

 

但是我遇到了一个问题,就是如果文件名改成中文的话,就会出现文件不存在的错误

后来找到解决办法是

在开始申明

header("Content-type: text/html;charset=utf-8");

申明网页的编码格式

 

然后强制转换编码

$file_name = iconv("utf-8","gbk//IGNORE",$file_name);

把UTF-8的编码强制转换为GBK

完整代码如下:

本例题 在download.php同级目录下有测试简历.docx文件

 

header("Content-type: text/html;charset=utf-8");
$file_name = '测试简历.docx';
$file_name = iconv("utf-8","gbk//IGNORE",$file_name);
$file_sub_path =$_SERVER['DOCUMENT_ROOT'].__ROOT__.'/Public/Download/';
$file_path = $file_sub_path.$file_name;
if (!file_exists($file_path)){  //判断文件是否存在
    echo "文件不存在";
    exit();
}
$fp = fopen($file_path,"r+"or die('打开文件错误');   //下载文件必须要将文件先打开。写入内存
$file_size = filesize($file_path);
//返回的文件流
Header("Content-type:application/octet-stream");
//按照字节格式返回
Header("Accept-Ranges:bytes");
//返回文件大小
Header("Accept-Length:".$file_size);
//弹出客户端对话框,对应的文件名
Header("Content-Disposition:attachment;filename=".$file_name);
//防止服务器瞬间压力增大,分段读取
$buffer = 1024;
while(!feof($fp)){
    $file_data = fread($fp,$buffer);
    echo $file_data;
}
fclose($fp);

原文地址:https://www.cnblogs.com/zzeng347/p/8182501.html