Monday, April 23, 2012

Force download image?




Is there a way to make an image a download once you click on it (without rightclick save image as)?





I'm using a small Javascript fucntion to call the download page:




<a href="#" onclick="window.open('download.php?file=test.jpg', 'download', 'status=0');">Click to download</a>



In the download.php page I have something like:




$file = $_GET['file'];
header('Content-Description: File Transfer');
header("Content-type: image/jpg");
header("Content-disposition: attachment; filename= ".$file."");
readfile($file);



But it doesn't work. What am I doing wrong?

Thanks in advance!


Source: Tips4all

10 comments:

  1. Use application/octet-stream instead of image/jpg:


    If [the Content-Disposition] header is used in a response with the application/octet-stream content-type, the implied suggestion is that the user agent should not display the response, but directly enter a `save response as...' dialog.
    — RFC 2616 – 19.5.1 Content-Disposition

    ReplyDelete
  2. I think you forgot to add Path on the header

    if(isset($_GET['file'])){
    //Please give the Path like this
    $file = 'images/'.$_GET['file'];

    if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
    }
    }

    ReplyDelete
  3. Once you’ve added the Content-Disposition: attachment header, you should be able to use a normal link:

    <a href="download.php?file=test.jpg">Click to download</a>


    What browsers have you tried this with?

    ReplyDelete
  4. Or you can use .htaccess file for all your image files. In case you want to force the browser to download all your images (f.e. from a table list):

    RewriteEngine On
    RewriteBase /
    RewriteCond %{QUERY_STRING} ^download$
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule .(jpe?g|gif|png)$ index.php?file=noFoundFilePage [L,NC]
    RewriteCond %{QUERY_STRING} ^download$
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .(jpe?g|gif|png)$ - [L,NC,T=application/octet-stream]


    This looks for image files a tries to force download them into the browser. The -f RewriteConds also checks that the file exsist.. The last rule ensures that download is used only for certain file types.

    ReplyDelete
  5. Browsers recognize jpg URL's and hand them over just like a .htm, so I don't think you can force it on the user-end (not positive on that, though).

    Read this

    http://apptools.com/phptools/force-download.php

    ReplyDelete
  6. The code you posted works for me. Are you sure you've entered the correct paths for download.php and test.jpg?

    When you say its not working are you getting an error or what do you see?

    ReplyDelete
  7. See if this helps:

    Webkit and Excel file(PHPexcel)

    ReplyDelete
  8. Try to change this:

    header("Content-disposition: attachment; filename= ".$file."");


    To:

    header("Content-disposition: attachment; filename= ".$file);


    If the above doesn't work to you, here a function to force a file to be downloadable:

    <?php
    function downloadFile($file, $type)
    {
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Disposition: attachment; filename=$file");
    header("Content-Type: Content-type: $type");
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".filesize($file));
    readfile($file);
    }

    downloadFile("sd.jpg", "image/jpg");
    ?>

    ReplyDelete
  9. Here's a way to force all files in a certain directory to be prompted for a download.

    Requirement


    Apache
    mod_headers enabled


    In your .htaccess or Apache configuration put the following.

    <Directory /path/to/downloadable/files>
    Header set Content-Disposition attachment
    Header set Content-Type application/octet-stream
    </Directory>

    ReplyDelete
  10. This worked for me

    header("Pragma: public");
    header('Content-disposition: attachment; filename='.$title);
    header("Content-type: ".mime_content_type($sample_file));
    header('Content-Transfer-Encoding: binary');
    ob_clean();
    flush();
    readfile($sample_file);


    I also added the following to .htaccess

    SetEnvIf Request_URI "\.jpg$" requested_jpg=jpg
    Header add Content-Disposition "attachment" env=requested_jpg


    Not sure if that helps?

    ReplyDelete