php保存的文件下载不是预期的

时间:2016-04-23 06:03:15

标签: php

我有LONGBLOB列的MySQL表来保存文件(虽然我知道直接在数据库中保存文件不是一个好习惯。)保存工作正常!总结(C:\ ProgramData \ MySQL \ MySQL Server 5.7 \ Data \ dogsport)dogsport的大小已增加到保存的新文件。

我写了下载脚本部分。文件下载到计算机正常(不在网页中显示图片)。

问题:下载的文件只显示4个字节,但应该是4.83 MB。当我打开图像时,图像也不显示(见截图)

enter image description here

是什么原因?

更新了@Andrew的代码:

            $query = "SELECT Id,Name,Type,SizeMB FROM Upload"; // Good practice. Do not process much data here. leave Content field
        $result = mysqli_query ( $con, $query) or die ("Couldn't execute SELECT query: ". mysqli_error($con));
        $nrows = mysqli_num_rows($result);
        echo '<table>
                    <tr>
                        <td>Id</td>
                        <td>Name</td>
                        <td>Type</td>
                        <td>Size (MB)</td>
                    </tr>';
        $selfpg = $_SERVER['PHP_SELF'];
        while( $row = mysqli_fetch_assoc($result) ){
            extract($row);
            echo "<tr>
                        <td>$Id</td>
                        <td>$Name</td>
                        <td>$Type</td>
                        <td>$SizeMB</td>
                        <td> <a href='$selfpg?id=$Id'> Download </a> </td>
                  </tr>";       
        }
        echo '</table>';

        //----------------------------------------------------------------------
        if ( isset($_GET['id']) ){

            $result_id = "SELECT Content FROM Upload WHERE Id=". $_GET['id'];

            $row = mysqli_fetch_assoc($result_id);
            extract($row);
            $size_bytes = $SizeMB * 1024 * 1024;
            header("Content-Type: ". $Type);
            header("Content-Length: ". $size_bytes);
            header("Content-Disposition: attachment; filename= ". $Name);

            echo $Content;
        }
        else{
            echo "<br>No id received to download a file</br>";
        }

仍有问题

更新!!! - 请用SQL

下载我的代码

http://s000.tinyupload.com/index.php?file_id=88155436688298142745

1 个答案:

答案 0 :(得分:1)

您的问题可能由此引起

header("Content-Length: ". $SizeMB);

Content-Length标头必须包含以字节为单位的大小,而不是兆字节。

另外,SELECT * FROM Upload - 这是不好的做法。您的查询将返回表格中的所有字段,包括longblob列。您不需要处理如此多的数据。在脚本中,您仅使用IdNameTypeSizeMB,因此请仅选择这些字段。而是

mysqli_data_seek($result,0);

您可以执行第二次查询:

SELECT Content FROM Upload WHERE Id = $Id