2017-03-25 10 views
0

auf einem bestimmten Blick, wenn ich um diesen Link:CakePHP 3 - Herunterladen unabhängig von den Host-und Projektnamen

<?php echo $this->Html->link('Download', ['controller' => 'Uploads', 'action' => 'download',$upload->id]) ?> 

Ein Benutzer eine Datei herunterladen kann basierend auf den $upload->id zur Verfügung gestellt.

Ich verwende dies als meine Download-Funktion in meinen Uploads Controller:

$upload = $this->Uploads->find('all')->first(); 
$filePath = '\xampp\htdocs\project\webroot\uploads'; //file path to where the uploaded file is 
$this->response->file($filePath . DS . $upload->name, 
    array('download' => true, 'name' => $upload->name)); //finds the corresponding name attribute in the Uploads table of the database, finds a matching name in the uploads directory and then downloads that file. 

$this->set(compact('upload')); 

Aber ich frage mich, ob es eine Möglichkeit, den Dateipfad flexibler sein müssen, um in der Lage war. In meinem config.php, habe ich zwei Variablen mit den Namen $host und $basepath auf den Web-Host (localhost) bzw. den Projektnamen (Projekt) verweisen festgelegt. Ich übergebe diese Variablen an den AppController und auf sie kann von jeder View aus zugegriffen werden.

Aber ich kann nicht diese Variablen in der $filePath Variable der Download-Funktion zu nutzen scheinen, also wenn ich oder jemand anderes waren Hosts oder den Projektnamen ändern, sondern können einfach zu sein config.php ändern, ich oder irgendjemand Sonst müsste ich das finden und es auch ändern (und wenn ich mehrere Download-Funktionen in mehreren Controllern hätte, müssten sie gehen und jeden von ihnen ändern).

+0

Haben Sie meinen Sie auf einfacher Weise Dateipfad Pfad zur Verfügung stellen möchten? In diesem Fall können Sie die Basis-URL verwenden oder den Pfad als Konstante definieren. –

Antwort

2

Werfen Sie einen Blick auf die globalen CakePHP-Konstanten. Sie können den Pfad zu Ihrem Webroot einfach mit WWW_ROOT aufrufen.

https://book.cakephp.org/3.0/en/core-libraries/global-constants-and-functions.html

+0

Wenn ich versuche, WWW_ROOT wie folgt zu verwenden: '$ filePath = WWW_ROOT.'uploads'.DS. $ Upload-> name;', bekomme ich diesen Fehler beim Downloadversuch (Beispieldatei, die heruntergeladen wird, ist eine leere Excel-Datei namens Book1 .xlsx: 'Die angeforderte Datei C: \ xampp \ htdocs \ projekt \ src \ C: \ xampp \ htdocs \ projekt \ webroot \ uploads \ Book1.xlsx \ Book1.xlsx wurde nicht gefunden oder ist nicht lesbar." Das scheint WWW_ROOT zu sein versuchen Sie und gehen Sie zuerst in den Quellcode, dann gehen Sie wieder zurück, bevor Sie in Richtung des richtigen Verzeichnisses gehen. – mistaq

+0

@mistaq Wenn Sie Ihr $ filePath debuggen, sieht das richtig aus? Wenn ja, http://stackoverflow.com/questions/18222047/clayphp-file-download-was-nicht-gefunden-oder-nicht-lesbar –

+0

debug ($ filePath) gibt dies: "C: \ xampp \ htdocs \ projekt \ webroot \". Aber auf jeden Fall habe ich meine Antwort gefunden von diesem und änderte $ filePath in 'WWW_ROOT.DS.'uploads '; – mistaq