Hi Jörg,

I'll show you the basics of how I just did this. In my case, the files
are stored above webroot and there's a record for each in the
database. The table was created like so:

CREATE TABLE item_files
(
        id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        created DATETIME DEFAULT NULL,
        modified DATETIME DEFAULT NULL,
        item_id INT(10) NOT NULL,
        directory VARCHAR(255) NOT NULL,
        basename VARCHAR(64) NOT NULL,
        extension VARCHAR(4) NOT NULL,
        type VARCHAR(64) NOT NULL,
        size INT(11) UNSIGNED NOT NULL,
        
        FOREIGN KEY (item_id) REFERENCES items (id) ON DELETE CASCADE   
)
ENGINE=MyISAM;

First, create a directory inside /app. Call it 'files' or something
and put your PDFs in it. These are now inaccessible from the browser.
Don't confuse this with /app/webroot/files, which is accessible.

In your controller, create a download() method. I'm leaving out a lot
of stuff in my own; this is just the basics. This action uses the
MediaView, which is perfect for serving files that are above webroot.

public function download($item_file_id)
{
        // you'll want to check the login status here ...
        
        
        $result = $this->ItemFile->find(
                'first',
                array(
                        'conditions' => array('ItemFile.id' => $item_file_id),
                        'fields' => array('*'),
                        'contain' => array(
                                'Item' => array(
                                        'fields' => array('*')
                                )
                        )
                )
        );

        Configure::write('debug', 0);
        $this->view = 'Media';
        
        /* MediaView is really irritating
         */
        $name = substr(
                $result['ItemFile']['basename'],
                0,
                -(strlen($result['ItemFile']['extension']))
        );
        
        $params = array(
                'id' => $result['ItemFile']['basename'],
                'name' => $name,
                'download' => true,
                'extension' => $result['ItemFile']['extension'],
                'path' => APP.$result['ItemFile']['directory'].DS,
                'mimeType' => array($result['ItemFile']['type'])
        );
        $this->set($params);
}

That's about it. Have a look in cake/libs/view/media.php to see how
MediaView works.

On Mon, Jul 13, 2009 at 6:22 AM, joergpb<[email protected]> wrote:
>
> Hello CakePhp Group!
>
> My name ist Jörg, form Berlin/Germany.
>
> I am quite new to Cake. My problem is that I need a downloadarea where
> the user can only download pdfs ( or any files)  from the filesystem
> after he logged in. So the URL to the download has to be dynamic.
>
> Any idea how I may get this done with cake?
>
> Thanks a lot !
>
> Jörg
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"CakePHP" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to