ExpressionEngine CMS
Open, Free, Amazing

Thread

This is an archived forum and the content is probably no longer relevant, but is provided here for posterity.

The active forums are here.

Is there any way to download a image when it is clicked?

December 24, 2010 6:21am

Subscribe [2]
  • #1 / Dec 24, 2010 6:21am

    chefnelone

    157 posts

    hello

    Just that. Any class, helper, plugin to to download a image when it is clicked?


    I used to use this: (but since CI doesn’t allow GET it doesn’t work)

    <?php 
    // Force download of image file specified in URL query string and which 
    // is in the same directory as this script: 
    if(!empty($_GET['img'])) 
    { 
       $filename = basename($_GET['img']); // don't accept other directories 
       $size = @getimagesize($filename); 
       $fp = @fopen($filename, "rb"); 
       if ($size && $fp) 
       { 
          header("Content-type: {$size['mime']}"); 
          header("Content-Length: " . filesize($filename)); 
          header("Content-Disposition: attachment; filename=$filename"); 
          header('Content-Transfer-Encoding: binary'); 
          header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
          fpassthru($fp); 
          exit; 
       } 
    } 
    header("HTTP/1.0 404 Not Found"); 
    ?>


    Thanks

    and… Merry Christmas to everyone!

  • #2 / Dec 24, 2010 7:35am

    Twisted1919

    500 posts

    you can pass the filename as uri segment. That’s what i do.
    Beside, i have .html extension, so the download url becomes :
    /download/image/large/md5-of-the-file-name.EXT.html

  • #3 / Dec 24, 2010 7:47am

    chefnelone

    157 posts

    you can pass the filename as uri segment. That’s what i do.
    Beside, i have .html extension, so the download url becomes :
    /download/image/large/md5-of-the-file-name.EXT.html

    I’ll try what you say.

  • #4 / Dec 24, 2010 8:06am

    cereal

    38 posts

    Or you can create a controller “download” like this:

    <?php
    
    class Download extends Controller {
    
        function Download()
        {
            parent::Controller();
            $this->load->helper(array('url', 'download'));
        }
        
        function image()
        {
            @ob_end_clean();
        $data = file_get_contents($this->input->server('DOCUMENT_ROOT') . 'images/' . $this->uri->segment(3));
            $name = $this->uri->segment(3);
            force_download($name, $data);
        }
    }
    ?>

    To download just call: http://your.server/download/image/name_of_file.jpg

    This way you can add a session check to prevent direct linking, keep track of downloads, you can hide the real path and you can use an .htaccess file to prevent downloads from the images/ directory. Bye 😊

  • #5 / Dec 24, 2010 8:33am

    chefnelone

    157 posts

    Or you can create a controller “download” like this:

    <?php
    
    class Download extends Controller {
    
        function Download()
        {
            parent::Controller();
            $this->load->helper(array('url', 'download'));
        }
        
        function image()
        {
            @ob_end_clean();
        $data = file_get_contents($this->input->server('DOCUMENT_ROOT') . 'images/' . $this->uri->segment(3));
            $name = $this->uri->segment(3);
            force_download($name, $data);
        }
    }
    ?>

    To download just call: http://your.server/download/image/name_of_file.jpg

    This way you can add a session check to prevent direct linking, keep track of downloads, you can hide the real path and you can use an .htaccess file to prevent downloads from the images/ directory. Bye 😊

    I tried but I’m getting this error:

    ErrorException [ Warning ]: file_get_contents(http://192.168.1/ci/uploads/galeriasFotos/image_jpg&#41; [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 404 Not Found
    The image is in /uploads/galeriasFotos/

    I can see that the problem is that the controller change image.jpg to image_jpg.
    Why is that?
    html:

    <a href="http://192.168.1/ci/download/image/image.jpg"></a>
  • #6 / Dec 24, 2010 8:43am

    cereal

    38 posts

    192.168.1 is a wrong IP, try with the correct one, you are getting a 404 error, let me know, bye 😊

  • #7 / Dec 24, 2010 8:55am

    chefnelone

    157 posts

    192.168.1 is a wrong IP, try with the correct one, you are getting a 404 error, let me know, bye 😊

    you right… but I just wrote the wrong one, correct one is : 192.168.1.33
    but still getting same error message

    What about the change from ‘.’ to ‘_’
    I think this is the point but don’t know how to fix it…

    also keep in mind that the image is in /uploads/galeriasFotos/

  • #8 / Dec 24, 2010 10:26am

    cereal

    38 posts

    I don’t know why it’s changing from dot to underscore but I believe something should be change in your Apache config, In my experience CI never worked good in a local server running multiple sites without configuration. If you want to try, add a site following the instructions in point A, otherwise jump to the test at the end of my post (point B).

    A) You should create a file in sites-available/ where you set the Document Root and the Server Name:

    <VirtualHost *:80>
    
      # Admin email, Server Name (domain name) and any aliases
      ServerAdmin .(JavaScript must be enabled to view this email address)
      ServerName  test.local
      #ServerAlias <a href="http://www.test.local">http://www.test.local</a>
    
    
      # Index file and Document Root (where the public files are located)
      DirectoryIndex index.php
      DocumentRoot /var/www/your_local/httpdocs/
    
    
      # Custom log file locations
      LogLevel warn
      CustomLog /var/www/your_local/logs/access.log combined
      ErrorLog /var/www/your_local/logs/error.log
    
    </VirtualHost>

    Change the hosts file, so your browser will point to the local CI installation:

    127.0.0.1 test.local

    And use a2ensite to set the new config, after that you should restart your server:

    /etc/init.d/apache2 restart

    After that you should be able to call uri like this:

    <a href="http://test.local/download/image/image.jpg">http://test.local/download/image/image.jpg</a>

    This makes the local CI installation available from the other workstations on the same lan, just update the hosts on each workstation with the ip of the server:

    192.168.1.33 test.local

    B) Do a test, change:

    $data = file_get_contents($this->input->server('DOCUMENT_ROOT') . 'uploads/galeriasFotos/' . $this->uri->segment(3));
    $name = $this->uri->segment(3);

    to:

    $data = file_get_contents('http://192.168.1.33/ci/download/image/image.jpg');
    $name = 'image.jpg';

    If goes fine than, in the original, try to change uri->segment() to 4, or give a check to your base_url in config.php
    With file_get_contents you can use the DOCUMENT_ROOT or the uri, but the write one should be http://192.168.1.33/download/image/image.jpg

    base_url() . 'download/image/' . $this->segment->uri(3)

    Other than this I don’t know how to help you. Bye.

  • #9 / Dec 24, 2010 11:21am

    chefnelone

    157 posts

    I just used srt_replace to replace _jpg to .jpg, now is working right,
    Thanks

.(JavaScript must be enabled to view this email address)

ExpressionEngine News!

#eecms, #events, #releases