I found the solution, I ended up instead of using readfile, use fopen and
fpassthru.  Here is the code that solved the problem

<?php
    $pathtofile = '/abs/path/to/file'.urldecode( $_GET['link'] );
    $download = 'url/path/to/fille'.urldecode( $_GET['link'] );
    $type = urldecode( $_GET['type'] );
    $size = filesize( $pathtofile );
    header("Pragma: private");
    header("Expires: 0"); // set expiration time
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    // browser must download file from server instead of cache

    // force download dialog
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");
    header("Content-Type: $type");

    // use the Content-Disposition header to supply a recommended filename
and
    // force the browser to display the save dialog.
    header("Content-Disposition: attachment;
filename=".basename($download).";");

    /*
    The Content-transfer-encoding header should be binary, since the file
will be read
    directly from the disk and the raw bytes passed to the downloading
computer.
    The Content-length header is useful to set for downloads. The browser
will be able to
    show a progress meter as a file downloads. The content-lenght can be
determines by
    filesize function returns the size of a file.
    */
    header("Content-Transfer-Encoding: binary");
    header("Accept-Ranges: bytes");
    header("Content-Length: $size");

    $fh = fopen( $pathtofile , "r");
    fpassthru($fh);
?>
> Okay, I found a solution to part one of my questions by changing my
headers,
> but for some reason I am still getting a fractional download of the file.
> Most commonly it's about 16.6KB of a 4MB file. The kicker is it says that
it
> completed successfully.
>
> Here is the modified code:
> <?php
>     $download = 'url/path/to/file'.urldecode( $_GET['link'] );
>     $type = urldecode( $_GET['type'] );
>     $size = filesize( '/abs/path/to/file'.urldecode( $_GET['link'] ) );
>     header("Pragma: public");
>     header("Expires: 0"); // set expiration time
>     header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
>     // browser must download file from server instead of cache
>     // force download dialog
>     header("Content-Type: application/force-download");
>     header("Content-Type: application/octet-stream");
>     header("Content-Type: application/download");
>     // use the Content-Disposition header to supply a recommended filename
> and
>     // force the browser to display the save dialog.
>     header("Content-Disposition: attachment;
> filename=".basename($download).";");
>     /*
>     The Content-transfer-encoding header should be binary, since the file
> will be read
>     directly from the disk and the raw bytes passed to the downloading
> computer.
>     The Content-length header is useful to set for downloads. The browser
> will be able to
>     show a progress meter as a file downloads. The content-lenght can be
> determines by
>     filesize function returns the size of a file.
>     */
>     header("Content-Transfer-Encoding: binary");
>     header("Content-Length: ".(string)($size));
>     readfile("$download");
> ?>
>
> > I am having some trouble making it possible to download a file using the
> > header function.  The problems are: (1) I get the dialog box to download
> the
> > file, but for some reason the type of file isn't getting passed to the
> box,
> > and (2) when I download a 4MB file it only seems to be getting 16.6KB.
> >
> > I haven't used header for this purpose before this, so maybe I am
missing
> > something.  I Googled around and found the content-disposition type I
> > thought I needed, I actually tried 3 different types (the file is a
> > compressed zip file).  I Googled around for tutorials on downloading
files
> > and still haven't found the answer to correcting my problem.  Here is
the
> > code I am using, maybe a couple more trained eyes looking at this could
> help
> > me out.
> >
> > <?php
> >     $download = 'http://www.usa-financial.com'.urldecode(
$_GET['link'] );
> >     $type = urldecode( $_GET['type'] );
> >     $size = filesize( '/home2/www/usa-financial'.urldecode(
> > $_GET['link'] ) );
> >     header("Content-type: $type");
> >     header("Content-Disposition: attachment; filename=$download;");
> >     header("Accept-Ranges: bytes");
> >     header("Content-Length: $size");
> >
> >     echo "<!-- $type \n $size \n $download \n -->\n";
> > ?>
> >
> > Josh

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to