【问题标题】:Error: Downloading broken file by fread in php错误:在 php 中通过 fread 下载损坏的文件
【发布时间】:2015-05-15 03:00:03
【问题描述】:

我尝试了不同的代码从 php 下载文件。

fileread() 给出问题所以,现在这甚至不是一个选项。

我现在正在尝试使用 fread(),但它给出的问题是,当您下载文件时,该文件永远无法工作。我下载损坏的文件。例如,如果我下载图像文件,它将在 picasa 中给出错误无效图像。 (如下图)

以下是我正在使用的代码:

<?php
    require '../php/db.php'; // Database Connection (No issue in this)
    ob_start();
    set_time_limit(0);  // To set script time to infinity.
    ini_set('memory_limit', '512M');
    if(isset($_GET['file_id'])&&!empty($_GET['file_id'])) download_file($_GET['file_id']);  // calling a function download_file given below
    else die("There was an error in downloading file. Please try again later.");

function download_file($id){
    global $con;  // For database connection
    $id = mysqli_real_escape_string($con,htmlentities($id));
    $file="SELECT file_name,file_title,file_size,down FROM files WHERE file_id= $id"; // Taking file info from database
    $result = mysqli_query($con,$file);
    if($result) echo "Okay!";
    $row = mysqli_fetch_assoc($result);
    $name = $row['file_name'];  // File is stored with this name in same dir
    $title = $row['file_title'];
    $ext = ext($name);
    $down = $row['down']; // Tells number of downloads
    $newname = $title.'.'.$ext; // Changing file name while downloading.
    $down++;

    if(is_file($name)) {
        $update_down = "UPDATE files SET down = $down WHERE file_id = '$id'";
        $update_down_result = mysqli_query($con,$update_down); // Increment number of downloads

        download_by_fread($name,$newname); // Calling a function

        exit;

    }else header("Location: ../index.php?msg=Sorry!+File+could+not+found!");
}

function download_by_fread($name,$newname){
    if($fd=fopen($name, "rb")){

        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: private",false);
        header("Content-type: ".tell_file_type($name));
        header("Content-Disposition: attachment; filename=\"".$newname."\"");
        header("Content-length: ".filesize($name));
        header("Cache-control: public"); //use this to open files directly

        while(!feof($fd)) {
            print(fread($fd, 4096));
            ob_flush();
            flush();
        }
    }else header("Location: ../index.php?msg=Sorry!+File+could+not+found!");
    fclose($fd);
}

function ext($name){
    $rut = strrev($name);
    $erut = explode('.', $rut);
    return strrev($erut[0]);
}

function tell_file_type($file_name){
    $rut = strrev($file_name);
    $erut = explode('.', $rut);
    $ext = strrev($erut[0]);    
    switch($ext){
        case 'txt': return 'text/plain'; break;
        case 'rar':
        case 'zip': return 'application/x-compressed'; break;
        case 'gif': return 'image/gif'; break;
        case 'jpg':
        case 'jpeg': return 'image/jpeg'; break;
        case 'bmp': return 'image/bmp'; break;
        case 'png': return 'image/png'; break;
        case 'pdf': return 'application/pdf'; break;
        case 'mp3': return 'audio/mpeg3'; break;
        case 'mp4': return 'video/mp4'; break;
        case 'mkv': return 'video/mkv'; break;
        case 'mpg': return 'video/mpeg'; break;
        case 'avi': return 'video/avi'; break;
        case 'wav': return 'audio/wav'; break;
        case 'doc':
        case 'docx': return 'application/msword'; break;
        case 'pps':
        case 'ppt':
        case 'pptx': return 'application/mspowerpoint'; break;
        case 'xls':
        case 'xlsx': return 'application/excel'; break;
        case 'exe': return 'application/octet-stream'; break;
        case 'swf': return 'application/x-shockwave-flash'; break;
    }
}

?>

请帮我找出这段代码中的错误。

谢谢。

回答: 我发现了错误。我在呼应“好!”在 mysql_query 之后。检查查询是否成功。我们可以这样做,否则它将被添加到文件中。并且文件将失效。

【问题讨论】:

  • 您的代码中必须有一些空行。此文件中的../php/db.php 中也可能有一些空格。
  • 空白行?我不明白。 db.php 用于数据库连接。它连接没有任何问题。计数器也正确更新。主要问题在于下载文件。
  • page 中会出现一些空格/行。您可以通过将图像文件的扩展名更改为 .txt 并在某个编辑器中打开它来检查这一点,如果您将删除这些行并保存并再次更改图像的扩展名,您会在代码顶部找到一些空白行会工作
  • 感谢 Vikas 对我的帮助很大。 :)
  • 这消除了无效文件的问题,但仍然给出了由 fileread() 生成的相同问题。一些大文件没有完全下载。可能是脚本执行时间的问题。如果您想查看问题,请关注此link。如果您将下载一个小文件,它将正常工作。但问题始于大文件。 ~10 MB。

标签: php http-headers fread download


【解决方案1】:

从 PHP 文件的末尾删除 ?&gt;,并确保开头的 &lt;?php 之前没有空格。

可能发生的情况是 PHP 正在向图像的输出发送“”空格字符。如果 PHP 括号外有任何内容,则会导致文件损坏,因为这些内容会自动作为内容发送到浏览器。

【讨论】:

  • 我发现了问题。我在回应“好的!”在 mysql_query 之后。检查查询是否成功。
猜你喜欢
  • 2015-07-16
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多