Momentan unterstützt ExtBase noch keine file upload magie. Daher ist man gezwungen das ganze händisch zu machen. Der Aufwand dafür hält sich allerdings in Grenzen.
Grundsätzlich muß man in der entsprechenden Controller Action manuell $_FILES auswerten, das temporäre Upload File an die richtige Stelle verschieden und das betreffende Model Property setzen.
In Code sieht das dann etwa so aus:
public function createAction(Tx_Example_Domain_Model_Article $newArticle) { if ($_FILES['tx_example_article']) { $basicFileFunctions = t3lib_div::makeInstance('t3lib_basicFileFunctions'); $fileName = $basicFileFunctions->getUniqueName( $_FILES['tx_example_article']['name']['newArticle']['image'], t3lib_div::getFileAbsFileName('uploads/tx_example/')); t3lib_div::upload_copy_move( $_FILES['tx_example_article']['tmp_name']['newArticle']['image'], $fileName); $newArticle->setImage(basename($fileName)); } ... ... } |
Natürlich kann man das ganze noch in eine seperate Controller Funktion oder einen FileUpload Service abstrahieren und mit entsprechenden Exceptions sichern, aber das Beispiel hier dient ja nur dazu den grundsätlichen Ansatz zu verdeutlichen.
Der passend view code fuer das Beispiel oben sieht so aus:
<f:form enctype="multipart/form-data" method="post" controller="Article" action="create" name="newArticle" object="{newArticle}"> <f:form.upload property="image" /> ... ... </f:form> |
Update 20.10.2011
Es gibt einige Besonderheiten im Hinblick auf die PHP Einstellungen post_max_size und upload_max_filesize zu beachten:
Liegt man mit dem Upload über post_max_size so ist sowohl $_FILES als auch $_POST leer, weil PHP die Daten „wegschmeisst“. Das führt natürlich dazu, dass der Controller sich darüber mit
„Required property ‘whatever’ does not exist“ beschwert.
Man kann sich hier spontan behelfen indem man:
A. Den Wert von post_max_size erhöht und upload_max_filesize beibehält. Oder
B. Die Annotation des Properties auf NULL|Tx_Whatever und den default Wert auf NULL setzt und dann im Controller eine detailierte Fehler Auswertung macht.
Die 2te Variante wirft allerdings das Problem auf, dass man nicht wirklich Rückschlüße auf den aufgetretten Fehler ziehen kann.
So kann $whatever === NULL bedeuten, dass der Upload zu gross war oder aber der entsprechende Parameter im Request gar nicht enhalten war.
Als Notlösung kann man hier die CONTENT_LENGTH herranziehen:
if ($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST) &&; $_SERVER['CONTENT_LENGTH'] > 0) |
Möglicherweise ist das etwas, das das Framework intern handhaben sollte.
Im Zweifelsfall kann man auch den Upload auf einem weiteren Formular oder Schritt unterbringen und hat damit diese Probleme nicht.
Lieg man nur über upload_max_filesize so erhält man den entsprechenden Fehler gemäss:
http://www.php.net/manual/de/features.file-upload.errors.php in dem $_FILES array.
Die ursprügliche Prüfung auf „if ($_FILES[‚tx_example_article‘]) “ ist übrigens unzureichend. Empfehlenswerter ist es hier auf den error code zu prüfen bevor man mit der eigentlichen Dateibearbeitung beginnt.
Vielen Dank für die Kommentare zu dem Thema 🙂