theartist33
theartist33

Reputation: 482

Download file program using php on unix box

I have created a beginner program to forcefully download file from unix box to windows through browser, it is not throwing any error but shows nothing on browser just a blank page.

PHP version- 5.2.13
Apache-2.0
Unix Box- HP-UX 11.11 (old version latest is 11.31)
local PC- windows XP Prof.
Browser- IE 7, Mozilla.

Below is my code (this code resides on unix box):

<?php
    ob_start();
    $file = '/opt/hpws/apache/htdocs/barn/file2';

    if (file_exists($file)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream;charset=utf-8');
        header('Content-Disposition: attachment; filename=$file');
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));

        readfile($file);
        exit;
    }
?>

Upvotes: 1

Views: 243

Answers (2)

LSerni
LSerni

Reputation: 57378

Okay, let's add some checks and debugging.

<?php

    $file = '/opt/hpws/apache/htdocs/barn/file2';

    if (!file_exists($file)) {
        die("The file does not exist");
    }
    if (!is_file($file)) {
        die("Not a file"); // Worry about symlinks later
    }
    if (!is_readable($file)) {
        die("The file is not readable");
    }

    die("DEBUG: Okay, will send the file -- remove this line and retry");

    $name = basename($file); // Or anything else

    header('Content-Type: application/octet-stream');
    header("Content-Disposition: attachment; filename=\"{$name}\"");
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit();
?>

If this does not work, it should at least tell you why. Also, on the first run, the one when it will still not download the file but only tell you that it will, check that the page does not contain anything else except that one line. Otherwise, you're setting yourself up for a fall; if not this once, as soon as you have to send a file larger than your output buffers, or too many files for your system memory.

Upvotes: 0

Funk Forty Niner
Funk Forty Niner

Reputation: 74216

This line had quotation marks missing:

header('Content-Disposition: attachment; filename=$file');

and in trying to use that line of code, the browser would prompt to save the file as $file.

The line of code should read as:

header('Content-Disposition: attachment; filename="'.basename($file).'"');

The following (tested with a binary file) with file inside the same folder as executed code.

NOTE: You could use header("Content-Type: application/text"); if it's an ASCII file.

<?php
    ob_start();
    $file = 'file.zip';

    if (file_exists($file)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream;charset=utf-8');
        header('Content-Disposition: attachment; filename="'.basename($file).'"');

        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));

        readfile($file);
        exit;
    }
?>

Upvotes: 1

Related Questions