• PHP中文名文件下载实现


      

    php下载文件的流程:

    其实就是给予一个链接:  <a 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);

     

     

     

     

     

  • 相关阅读:
    leetcode简单刷题
    pycharm常用快捷键
    pycharm之black配置for python file(代码格式化工具)
    appium
    scheduleAtFixedRate 和 timer 执行对比
    Java 线程池创建的四种方式
    java 数据库连接池和普通连接 对比
    java 线程池 实现
    java 定时任务 Timer 范例
    java加载properties配置文件的几种方法
  • 原文地址:https://www.cnblogs.com/zhouqi666/p/5980543.html
Copyright © 2020-2023  润新知