Die beiden englischsprachigen Blogs verraten auch nur die halbe Wahrheit und die deutschsprachigen Seiten, die man so findet, schaffen es gerade einmal einen Link auf diese Blogs zu setzen (mit Ausnahme DIEEVOLUTION).
Auch die Doku bei cakePHP ist nicht ganz vollständig zu diesem Thema.
Zum Thema:
Die Beispiele, die man zum Thema Fileupload mit cakePHP im Internet findet, beschreiben alle das Speichern der Daten in einer Datenbank-Tabelle. Ich denke nicht, dass das die meisten Anwender möchten. Vielmehr möchte man doch die Datei in ein Verzeichnis schieben und dann einfach verlinken.
Was brauchen wir: einen Controller, ein Modell und einen View (Formular für File-Upload).
Der View fileupload/index.ctp:
- Code: Alles auswählen
<p>W&auml;hlen Sie eine lokale Datei aus.</p>
<?php
echo $form->create(null, array('action' => 'add', 'type' => 'file', 'name'=>'Fileupload'));
echo $form->file('File');
echo $form->submit('Upload');
echo $form->end();
?>
Folgende Anmerkungen sind hier zu machen:
Der erste Parameter null besagt, dass wir kein(!) Modell hier mitgeben. Eine Sache, die einen zur Verzweiflung treiben kann. Würden wir hier "fileupload" schreiben, würde cakePHP verzweifelt einen Controller fileuploads suchen (und nicht finden). Der Parameter name fehlt in der Doku. Ich fand ihn zufällig in einer Meldung bei cakePHP. Gerade diesen Parameter benötigen wir aber unbedingt, wenn wir keine Datenbanktabelle und somit kein "echtes" Modell verwenden.
Nun das Modell:
- Code: Alles auswählen
Ich denke da gibt es nichts besonderes zu sagen.
Der Controller:
- Code: Alles auswählen
- <?php
class FileuploadController extends AppController {
var $name = 'Fileupload';
var $uses = 'Fileupload';
var $helpers = array('Html','Form');
/******************************************************************************
Function : index()
Arguments : -
Description: Einstiegsseite
Template : fileupload/index.ctp
*******************************************************************************/
function index() {
}
/******************************************************************************
Function : add()
Arguments : -
Description: Upload und verschieben der Datei
Template : add.ctp
*******************************************************************************/
function add() {
if (!empty($this->data) &&
is_uploaded_file($this->data['Fileupload']['File']['tmp_name'])) {
$fileData = fread(fopen($this->data['Fileupload']['File']['tmp_name'], "r"),
$this->data['Fileupload']['File']['size']);
$this->data['Fileupload']['name'] = $this->data['Fileupload']['File']['name'];
$this->data['Fileupload']['type'] = $this->data['Fileupload']['File']['type'];
$this->data['Fileupload']['size'] = $this->data['Fileupload']['File']['size'];
$this->data['Fileupload']['data'] = $fileData;
move_uploaded_file($this->data['Fileupload']['File']['tmp_name'], 'img/'.$this->data['Fileupload']['name']);
$this->redirect('/fileupload');
}
}
}
?>
O.k. zum Controller noch ein paar Sätze: Über 'Fileupload' (da findet sich der Name unseres Formulars wieder) identifizieren wir das Formular und damit die Datei.
Mit move_uploaded_file verschieben wir die Datei in das Zielverzeichnis (hier das Bilder-Verzeichnis img).
Vielleicht hilft dem einen oder anderen das kleine Beispiel ein paar Minuten zu sparen.
Ciao Thomas

