各位大牛好,我是一个菜鸟,目前在学习php过程中,今天在学习文件操作的时候写了一个下载页面练手,结果发现一个有趣的现象,就是不用filesize这个参数的时候,直接fopen()后,用循环
while(!feof($fp)){
$file_data=fread($fp,$buffer);
echo $file_data;
}后,如果是rar压缩包,那么可以正常下载并正常打开,如果是图片文件,那么可以下载,但是无法正常打开。望前辈解答。
代码如下:test.php
<form action="./result.php" method="POST">
<input type="hidden" name="file_name" value="demo1.jpg">
<input type="submit" value="下载图片">
</form>
<form action="./result.php" method="POST">
<input type="hidden" name="file_name" value="demo2.rar">
<input type="submit" value="下载压缩包">
</form>
result.php
<?php
$file_name=$_REQUEST['file_name'];
function down_file($file_name){//考虑中文文件名的转码问题 用iconv
$file_name=iconv("utf-8","gb2312",$file_name);
//绝对路径$file_path=$_SERVER['DOCUMENT_ROOT'].$file_name;
//打开文件$fp=fopen($file_path,"r") or die("文件不存在!");
//不使用filesize获取文件大小//$file_size=filesize($file_path);
//文件下载所需要的头文件header("Content-type:application/octet-stream");
header("Accept-Renges:bytes");
header("Accept-Length:$file_size");
header("Content-Disposition:attachment;filename=".$file_name);
//设置缓存大小$buffer=2048;
//判断文件是否读取结束,不判断filesize是否大于$buffer的计数while(!feof($fp)){
//把部分数据回送给浏览器
$file_data=fread($fp,$buffer);
echo $file_data;
}
//关闭文件
fclose($fp);
}
down_file($file_name);
?>
问题来了:
1.为什么rar文件(4MB)可以正常下载并打开,而图片文件(9KB)可以下载却不能打开,提示文件损坏呢?
(这里我猜测是header的参数问题?但是我百度了一下,搜不到什么结果,所以特地来请教一下)
2.为什么我在使用中文文件名的时候会提示出错呢?是iconv函数写错了?
3.我本来想在提交页面test.php用一个超链接<a>把两个参数$file_name和$file_sub_dir(文件存放的子目录,用来拼接$file_path 绝对路径的)但是百度了一下,还是找不到答案,无奈之下自己想了个笨办法,用隐藏域传了两个参数过去,但是类似“/file/”这种的带斜杠参数貌似写法有要求,所以暂时放下,先试了下传单个参数的效果,把文件存放的目录路径先写死了。只传了$file_name过去。我还想问问 要是想在test.php中,用<a href="./result.php?downfile=true">下载文件</a>这样把$file_name和$file_sub_dir的值传过去该怎么写?

呵呵,先在此谢过解答的各位。
1.我用你的代码测试正常,图片和压缩文件都可以正常打开。
2.中文文件名和编码有关,一个是你的页面编码,另一个是你的操作系统,如果是win的话就要转为gbk,linux的话就是utf8。编码统一就行了。
3.带斜杆的参数和普通参数一样的,可以正常传递。
我猜测的,你fopen 打开的文件, 服务器端有防盗链的设置。 简单用fopen 是无法获取正确的图片的。