关于php中文件操作的filesize一个奇怪的现象。求解答。

方力申 发布于 2012/06/04 11:24
阅读 1K+
收藏 0
PHP

各位大牛好,我是一个菜鸟,目前在学习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的值传过去该怎么写?


呵呵,先在此谢过解答的各位。
加载中
0
leo108
leo108

1.我用你的代码测试正常,图片和压缩文件都可以正常打开。

2.中文文件名和编码有关,一个是你的页面编码,另一个是你的操作系统,如果是win的话就要转为gbk,linux的话就是utf8。编码统一就行了。

3.带斜杆的参数和普通参数一样的,可以正常传递。

leo108
leo108
回复 @方力申 : result.php?file_name=xxx&file_sub_dir=xxx然后使用$_GET['file_name']来获取
方力申
方力申
能不能请教下用超链接怎么把两个参数$file_name和$file_sub_dir传到result.php里面呢?该怎么写?
0
mark35
mark35
为什么我在使用中文文件名的时候会提示出错呢?是iconv函数写错了?
不同浏览器有不同的处理方式,FF是用UTF-8,IE好像是做urlencode处理。具体可搜索下
方力申
方力申
哦。。我估计是我的php文件存储的时候选了ANSI格式了。我再试试。其实主要是第一个问题。
0
泡不烂的凉粉
泡不烂的凉粉

我猜测的,你fopen 打开的文件, 服务器端有防盗链的设置。 简单用fopen 是无法获取正确的图片的。

 

泡不烂的凉粉
泡不烂的凉粉
回复 @方力申 : 不是盗链问题,之前没看贴出来的代码。
方力申
方力申
这个不是防盗链吧。是我自己写来练手的页面而已。
泡不烂的凉粉
泡不烂的凉粉
回复 @leo108 : 我也不懂。那肯定不是盗链引起的。 fopen($file,'rb') 这样行不行。还是不行我就不知道了。
leo108
leo108
防盗链只对外部访问有效,内部不会有防盗链的
返回顶部
顶部