PHP实现中文名称文件下载

本文介绍了一种实现大文件分段下载的方法,该方法有助于减轻服务器压力,并探讨了不同文件类型(如.exe和压缩包)可能遇到的问题。此外,还详细解释了如何正确处理中文文件名的编码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是下载的代码

public function download($file_name)
    {
        $file_path = public_path('uploads');
        // utf-8中文名字必须转化,不认会乱码
        $file_name = iconv('utf-8', 'gb2312', $file_name);
        if (!file_exists($file_path . '\\' . $file_name)) {
            return '文件未找到!';
        } else {
            $file = fopen($file_path . '\\' . $file_name, 'r');
            Header("Content-type: application/octet-stream");
            Header("Accept-Ranges: bytes");
            Header("Accept-Length: ".filesize($file_path . '\\' . $file_name));
            Header("Content-Disposition: attachment; filename=" . $file_name);
            
            // 大文件分段下载,减轻一次性读取文件造成的服务器压力,如果是类似.exe的文件或者压缩包使用分段读取会造成文件无法正常使用,原因在下文
            $buffer = 1024;
            $file_count = 0;
            $file_size = filesize($file_path . '\\' . $file_name);
            
            while(! feof($file) && $file_count < $file_size)
            {
                $file_con = fread($file, $buffer);
                $file_count += $buffer;
                echo $file_con . '<br/>'; // 输出文件内容
            } 
            
            // 输出文件内容
            /* echo fread($file,filesize($file_path . '\\' . $file_name));
            fclose($file);
            exit; */
        }
        echo $file_name;
    }

一、大文件下载:用下面的这段带代码(注意:如果下载.exe或者压缩包之类会造成下载后无法正常使用的情况。)

例1::.exe文件

报错如下



例2:压缩文件

错误信息


// 大文件分段下载,减轻一次性读取文件造成的服务器压力,如果是类似.exe的文件或者压缩包
            $buffer = 1024;
            $file_count = 0;
            $file_size = filesize($file_path . '\\' . $file_name);
            
            while(! feof($file) && $file_count < $file_size)
            {
                $file_con = fread($file, $buffer);
                $file_count += $buffer;
                echo $file_con . '<br/>'; // 输出文件内容
            } 


二、一般的图片之类的小文件下载直接用下面注释的这段代码

// 输出文件内容
            /* echo fread($file,filesize($file_path . '\\' . $file_name));
            fclose($file);
            exit; */

注意:

中文名字需要用到这个php 内置函数
$file_name = iconv('utf-8', 'gb2312', $file_name);
这样做其实也对着了,看着确实是把utf-8转化为gb2312了,但是实际运行的话,往往都是以失败告终的,原因呢?

原因实际上也很简单,因为任何的函数都是执行错误的时候,同时很不幸的是iconv();就很终于出现错误。现在给你正确的答案。

$file_name = iconv('utf-8', 'gb2312//IGNORE', $file_name);

很简单的,只要后面加上一个//IGNORE就行,加上这个就可以是ICONV()函数忽略错误,继续执行。


同理,要像把gb2312换为utf-8只要写上 $file_name = iconv('gb2312', 'utf-8//IGNORE', $file_name);就行


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值