2013-04-08 20 views
5

Ho riscontrato un problema che sto cercando di risolvere da più di due giorni: ho creato un sito Web utilizzando cakephp e tutto funziona perfettamente ma mi sono bloccato quando ho provato a implementare il download collegamenti a file memorizzati sotto APP_DIR/someFolder/someFile.zip.file download di file cakephp

Come si impostano i collegamenti di download ai file all'interno di someFolder? Spesso mi sono imbattuto in "Media Views", ho provato a implementarli ma finora non ho avuto successo.

Inoltre, non esiste un modo più semplice per rendere i file scaricabili?

+0

Se si utilizza Apache, è possibile forzare scaricare con l'aggiunta di un '.htaccess' all'interno della directory 'download'. Vedi alcuni esempi qui: http://www.givegoodweb.com/post/30/forcing-a-download-with-apache-and-htaccess e http://www.timewasters-place.com/how-to-force -file-download-with-htaccess/In questo modo non è necessario servire i file per scaricare tramite PHP – thaJeztah

+0

Cosa ne pensi di metterli su APP_DIR/webroot/someFolder /? – SaidbakR

+0

@ sємsєм Hai ragione (non ho notato che i file non erano all'interno del webroot). Sebbene solo inserirli in una directory pubblica non li forzerà automaticamente a scaricare (ad esempio se il file è JPG). Aggiungendo un .htaccess che invia intestazioni di "download", sarà più facile per le persone "scaricare" i file invece di visualizzarli * all'interno del browser. Sebbene sia possibile visualizzare PHP (vedere la risposta sotto), questo non è sempre l'ideale, specialmente per i file di grandi dimensioni. – thaJeztah

risposta

15

Le visualizzazioni multimediali sono obsolete dalla versione 2.3. Dovresti usare invece Sending files.

Dai un'occhiata a questo esempio minimo nel controller:

public function download($id) { 
    $path = $this->YourModel->aMagicFunctionThatReturnsThePathToYourFile($id); 
    $this->response->file($path, array(
     'download' => true, 
     'name' => 'the name of the file as it should appear on the client\'s computer', 
    )); 
    return $this->response; 
} 

Il primo parametro di $this->response->file è relativo alla directory APP. Pertanto, chiamando lo $this->response->file('someFolder' . DS . 'someFile.zip') verrà scaricato il file APP/someFolder/someFile.zip.

"L'invio di file" richiede almeno CakePHP versione 2.0. Si prega inoltre di prendere in considerazione il link Cookbook sopra.


se si esegue una versione precedente di CakePHP si dovrebbe usare media Visualizzazioni come già citato nella sua interrogazione. Utilizzare questo codice e fare riferimento a Media Views (Cookbook).

Ecco lo stesso metodo per le versioni precedenti:

public function download($id) { 
    $this->viewClass = 'Media'; 
    $path = $this->YourModel->aMagicFunctionThatReturnsThePathToYourFile($id); 
    // in this example $path should hold the filename but a trailing slash 
    $params = array(
     'id' => 'someFile.zip', 
     'name' => 'the name of the file as it should appear on the client\'s computer', 
     'download' => true, 
     'extension' => 'zip', 
     'path' => $path 
    ); 
    $this->set($params); 
} 
+0

hmm ... L'ho implementato come descritto ma sto gettare: Chiama al metodo non definito CakeResponse :: files() ... L'ho inserito nella Documentazione e non ho trovato un metodo file() ma id ha trovato un metodo di download ma non riesco a farlo funzionare con Ether .. :( –

+0

@ sємsєм: Mi piacerebbe tenere fuori il Webroot Se possibile ... Non sono dati senili Ma mi sentirei meglio se questi file non fossero arent lì per il mondo di wole per afferrare copia e giocare vicino Con ... –

+0

@MichaelHofmair: quale versione di CakePHP usi? Come accennato nella mia risposta hai bisogno almeno di CakePHP versione 2.0.Ma ho modificato la mia risposta e aggiunto spiegazioni per le versioni precedenti – Jan