加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP readfile()导致文件下载损坏

发布时间:2020-12-13 18:25:22 所属栏目:PHP教程 来源:网络整理
导读:我使用 PHP脚本提供从我的网站下载必要的javascript计时器这个PHP脚本包含导致下载.但无论我尝试什么,下载的文件都会损坏.任何人都可以帮我指出我哪里出错了. 这是我的代码 ?phpinclude "db.php"; $id = htmlspecialchars($_GET['id']); $error = false; $co
我使用 PHP脚本提供从我的网站下载必要的javascript计时器这个PHP脚本包含导致下载.但无论我尝试什么,下载的文件都会损坏.任何人都可以帮我指出我哪里出错了.

这是我的代码

<?php
include "db.php";    
 $id = htmlspecialchars($_GET['id']);
 $error = false;
    $conn = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD);
    if(!($conn)) echo "Failed To Connect To The Database!";
    else{   
        if(mysql_select_db(DB_NAME,$conn)){
            $qry = "SELECT Link FROM downloads WHERE ID=$id";
            try{
                $result = mysql_query($qry);
                if(mysql_num_rows($result)==1){
                    while($rows = mysql_fetch_array($result)){
                        $f=$rows['Link'];
                    }
                    //pathinfo returns an array of information
                    $path = pathinfo($f);
                    //basename say the filename+extension
                    $n = $path['basename'];
                    //NOW comes the action,this statement would say that WHATEVER output given by the script is given in form of an octet-stream,or else to make it easy an application or downloadable
                    header('Content-type: application/octet-stream');
                    header('Content-Length: ' . filesize($f));
                    //This would be the one to rename the file
                    header('Content-Disposition: attachment; filename='.$n.'');
                    //Finally it reads the file and prepare the output
                    readfile($f);
                    exit();
                }else $error = true;
            }catch(Exception $e){
                $error = true;
            }
            if($error) 
            {
                header("Status: 404 Not Found");
                }
        }
  }
?>
首先,正如有些人在评论中指出的那样,在第一行打开PHP标记(<?php)之前删除所有空格,并且应该这样做(除非这个文件被其他文件包含或要求) . 当您在屏幕上打印任何内容时,即使是一个空格,您的服务器也会发送标题以及要打印的内容(在这种情况下,您的空白处).为防止这种情况发生,您可以: a)在编写标题之前不要打印任何内容; b)运行ob_start()作为脚本中的第一件事,编写内容,编辑标题,然后在希望将内容发送到用户浏览器时使用ob_flush()和ob_clean(). 在b)中,即使您成功编写标题而没有收到错误,空格也会破坏您的二进制文件.您应该只编写二进制内容,而不是使用二进制内容编写一些空格. ob_前缀代表输出缓冲区.当调用ob_start()时,您告诉应用程序您输出的所有内容(echo,printf等)应该保留在内存中,直到您明确告诉它’go'(ob_flush())到客户端.这样,您将输出与标题一起保存,当您完成编写它们时,它们将与内容一起发送.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读