PHP下载rar文件的问题

悠悠知我心 发布于 2015/12/16 12:22
阅读 354
收藏 0
PHP
        $url='http://xxxxxxx/566a8ebc09ebb.rar';
        $fp=fopen($url,"r");
        $info=get_headers($url,true);
        $file_size=$info['Content-Length'];
        $base_name=basename($url);
        header("Content-type:text/html;charset=utf-8");
        header("Content-type:".$info['Content-Type']);
        header("Accept-Ranges:bytes");
        header("Accept-Length:".$file_size);
        header("Content-Disposition:attachment;filename=".$base_name);
        $buffer=1024;
        $file_count=0;
        while(!feof($fp) && $file_count<$file_size){
            $file_con=fread($fp,$buffer);
            $file_count+=$buffer;
            echo $file_con;
        }

        fclose($fp);


下载zip的时候是ok的,但是rar文件,下载后,目测大小是正确的,但是解压缩的时候提示

未知的压缩文件尾。

加载中
0
悠悠知我心

我自己找到了问题所在,$fp=fopen($url,"r");,这里应该写成$fp=fopen($url,"rb")

php手册中这样说的

不同的操作系统家族具有不同的行结束习惯。当写入一个文本文件并想插入一个新行时,需要使用符合操作系统的行结束符号。基于 Unix 的系统使用 \n 作为行结束字符,基于 Windows 的系统使用 \r\n 作为行结束字符,基于 Macintosh 的系统使用 \r 作为行结束字符。

如果写入文件时使用了错误的行结束符号,则其它应用程序打开这些文件时可能会表现得很怪异。

Windows 下提供了一个文本转换标记('t')可以透明地将 \n 转换为 \r\n。与此对应还可以使用 'b' 来强制使用二进制模式,这样就不会转换数据。要使用这些标记,要么用 'b' 或者用 't' 作为 mode 参数的最后一个字符。

默认的转换模式依赖于 SAPI 和所使用的 PHP 版本,因此为了便于移植鼓励总是指定恰当的标记。如果是操作纯文本文件并在脚本中使用了 \n 作为行结束符,但还要期望这些文件可以被其它应用程序例如 Notepad 读取,则在 mode 中使用 't'。在所有其它情况下使用'b'

在操作二进制文件时如果没有指定 'b' 标记,可能会碰到一些奇怪的问题,包括坏掉的图片文件以及关于 \r\n 字符的奇怪问题。

在c中

“rb”      只读打开一个二进制文件,只允许读数据
0
Tuesday
Tuesday

文件太大, 目前php处理不了... 

验证一下md5

悠悠知我心
不是的,很小,不到1MB
0
旧城的骁珖
旧城的骁珖
header输出前 前 ob_clean();flush();  试试
0
忧郁的欧尼酱
忧郁的欧尼酱
直接readfile不可以么
悠悠知我心
readfile不是一个好的方案,有可能文件会很大的
0
陨落人间
陨落人间
利用HTTP断点续传原理
Http头 Range、Content-Range()
HTTP头中一般断点下载时才用到Range和Content-Range实体头,
Range用户请求头中,指定第一个字节的位置和最后一个字节的位置,如(Range:200-300)
Content-Range用于响应头请求下载整个文件。
返回顶部
顶部