<?php
// Make sure an ID was passed
include('include/function.php');
if(isset($_GET['id'])) {
// Get the ID
    $id = intval($_GET['id']);

    // Make sure the ID is in fact a valid ID
    if($id <= 0) {
        die('The ID is invalid!');
    }
    else {
        // Connect to the database
        $dbLink = new mysqli('localhost', 'root', 'jio', 'jio');
        if(mysqli_connect_errno()) {
            die("MySQL connection failed: ". mysqli_connect_error());
        }

        // Fetch the file information
        $query = "
            SELECT `id`,`date`,`expected_date`,`comname`,`type`,`name`,`path`,`mime`, `size`, `data`,`other_detail`,`remark`,`username`
            FROM `depository`
            WHERE `id` = {$id}";
        $result = $dbLink->query($query);

        if($result) {
            // Make sure the result is valid
            if($result->num_rows == 1) {
            // Get the row
                $row = mysqli_fetch_assoc($result);

                // Print headers

                header("Content-Type: ". $row['mime']);
                header("Content-Length: ". $row['size']);
                header("Content-Disposition: attachment; filename=". $row['name']);


            }
            else {
                echo 'Error! No image exists with that ID.';
            }

            // Free the mysqli resources
            mysqli_free_result($result);
        }
        else {
            echo "Error! Query failed: <pre>{$dbLink->error}</pre>";
        }
        mysqli_close($dbLink);
    }
}
else {
    echo 'Error! No ID was passed.';
}
?>

我正在尝试从路径位置(doc root)下载文件,但收到空文件下载或损坏的文件下载。任何人都可以建议我在上面的代码中哪里出错,或者使用其他任何东西。

最佳答案

发送邮件头后,您需要读取文件内容并发送数据-以下内容未经测试,但或多或少是您需要执行的操作。您可能需要根据sql结果中$filepath的内容调整$row['path']变量。

if($result->num_rows == 1) {
    $row = mysqli_fetch_assoc($result);

    header("Content-Type: ". $row['mime']);
    header("Content-Length: ". $row['size']);
    header("Content-Disposition: attachment; filename=". $row['name']);

    /* you need to actually read the file and send it */

    $filepath=$row['path'] . '/' . $row['name'];
    if( !realpath( $filepath ) ) exit('Filepath '.$filepath.' is incorrect');

    if( $file = fopen( $filepath, 'rb' ) ) {
        while( !feof( $file ) and ( connection_status()==0 ) ) {
            print( fread( $file, 1024*8 ) );
            flush();
        }
        fclose( $file );
    }

}

10-06 15:43