在PHP中如何从文件路径下载文件?

I am new to PHP and trying my hands into it. I am creating a file and writing back to it. Creating a file in some path and writing to it, works fine for me. But when i try to download the same file from the same path, its not getting downloaded instead I'm getting empty file.

    header('Content-type: text/xml');
    header("Content-Disposition: attachment; filename=".'check.xml');
    header("Content-Length: " . filesize('./download/'.$_SESSION['user_name'].'/check.xml'));
    readfile('download/'.$_SESSION['user_name'].'/check.xml');
            exit;

Hi, Thanks for everyone. But I saw very unusual thing. When i downloaded the file, I didn't got the full file.

Why this case

Try removing ./ from the start of the filepath, like follows:

header('Content-type: text/xml');
header("Content-Disposition: attachment; filename=".'check.xml');
header("Content-Length: " . filesize('download/'.$_SESSION['user_name'].'/check.xml'));
readfile('download/'.$_SESSION['user_name'].'/check.xml');
exit;

With Linux file systems, ./ means the root, so that's the equivalent of / and ../ means the directory above the current directory. It's best to use absolute file paths, but simply removing the ./ should suffice.

You will also need to flush the write buffers of PHP using flush()

Here is a good working function to download a file

Here is a version adapted from that page:

public static function downloadFile($fileName) {
    $filePath = $fileName;
    $size = filesize($filePath);

    // Taken from http://w-shadow.com/blog/2007/08/12/how-to-force-file-download-with-php/
    header("Content-type: text/plain");
    header("Content-Disposition: attachment; filename=\"$fileName\"");
    header("Content-Transfer-Encoding: binary");
    header("Accept-Ranges: bytes");
    // The three lines below basically make the download non-cacheable
    header("Cache-control: private");
    header("Pragma: private");
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    header("Content-Length: " . $size);

    if ($file = fopen($filePath, "r")) {
        $buffer = fread($file, $size);  // this only works for small files!
        print $buffer;
        flush();
        fclose($file);
    }
}