记一次用PHP下载的大坑

有关PHP下载的一次大坑

起因

采用PHP下载文件,刚开始用英文名字一切正常,后来换成中文名字,或者不能下载,或者是下载内容空白,或者是下载文件名无中文,于是百度了很多方法,但是都没有根本解决上面的所有问题。

借鉴

  1. 代码一:
	header("Content-type: application/octet-stream");
	header("Accept-Ranges: bytes");//按照字节大小返回
	header("Accept-Length: $FileSize");//返回文件大小
	header('Content-disposition:attachment;filename=' . basename($tmp_file));

	$FileSize=filesize($tmp_file);
	$File=fopen($tmp_file,"r");//打开文件
	$FileBuff=512;
	while($FileSize>=0){
		$FileSize-=$FileBuff;
		echo fread($File,$FileBuff);
	}
	fclose($File);

没达到要求。
2. 代码二

	*ob_clean();//清除一下缓冲区
	$_name = $filename; //上面已经转码过了
	$filepath = $path_dir.$_name;
	//$filename = mb_convert_encoding($filename,'UTF-8','GBK'); //生成的文件名称转换一下编码
	//info($filename);exit;
	//$filename = urlencode($filename);
	//var_dump(urlencode($filename));exit;
	$file=fopen($filepath,"r");
	header("Content-type:text/html;charset=utf-8");
	header("Content-Type: application/octet-stream");
	header("Accept-Ranges: bytes");
	header("Accept-Length: ".filesize($filepath));
	header("Content-Disposition: attachment; filename=" . $filename);
	echo fread($file,filesize($filepath));
	fclose($file);*

没起作用
3. 代码三,自己原来的代码,最简练

	header('Content-Type:text/html;charset=utf-8');
	header('Content-disposition:attachment;filename=' . basename($filename));
	$filesize = filesize($tmp_file);
	readfile($tmp_file);
	header('Content-length:' . $filesize);	

调试

  1. 期间,无论怎么转换$filename,都不行,比如采用
$filename = mb_convert_encoding($filename,'UTF-8','GBK');

或者采用

$filename = mb_convert_encoding($filename,'GBK','UTF-8');

都不成功。

  1. 后来,干脆自己先直接起了一个中文名字下载,居然成功了!代码如下:
	header('Content-Type:text/html;charset=utf-8');
	header('Content-disposition:attachment;filename=' . '调试.doc');
	$filesize = filesize($tmp_file);
	readfile($tmp_file);
	header('Content-length:' . $filesize);

结论

basename是一个大坑,对于中文给转换没啦!所以中文文件名要自己生成,别懒得省事,直接用它提取文件名,它能给你过滤掉中文。

证据

验证代码如下:

<?php	
	header("Content-type:text/html;charset=utf-8");
	$s = "设计ss123.doc";
	$r = basename($s);
	var_dump($s);
	var_dump($r);
?>

输出结果:

string(15) "设计ss123.doc" string(9) "ss123.doc"

中文被“吃”啦,或者自己“飞出锅“了!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值