vince schrieb
Ich habe eine Extbase extension unter TYPO3 6.1.7 laufen, und da kann man auf $_FILES zugreifen.
Ich schätze mal, dass da woanders etwas nicht stimmt.
Jupp, hat eine Weile gedauert, aber jetzt hab ich es (Danke auch an Alex Kellner für die Hilfe und Inspiration)
1. Damit $_FILES existiert, sollte man seinem Formular auch mitteilen, daß es doch bitteschön den enctype "multipart/form-data" benutzt :-p
2. Im jeweiligen Controller in der initializeAction muß dem Property Manager gesagt werden,
welchen Konvertierer er für die Eigenschaft Model->Bilddatei benutzen soll,
ansonsten gibt es eine nette Fehlermeldung
(Erklärung dazu gibt es hier: http://www.typo3lexikon.de/typo3-tutorials/extensions/extbase/property-mapper.html)
Das sieht dann so aus:
/**
* initialize action
*/
public function initializeAction() {
if ($this->arguments->hasArgument('events')) {
$this->arguments->getArgument('events')->getPropertyMappingConfiguration()->setTargetTypeForSubProperty('image', 'array');
}
}
Dann benötigt man die Funktionen, die das hochgeladene Bild auf Zulässigkeit(mime type) überprüfen, korrekten Dateinamen erzeugen (z.B. bei Dubletten) und das Bild letztendlich in den konfigurierten Ordner verschieben.
( alles innerhalb einer Utility-Klasse, hier habe ich mich bei Alex's femanager bedient und das Ganze entsprechend angepaßt für 6.1, namespaces usw.)
<?php
namespace smedjadotcom\Wsevents\Utility;
/**
*
* Misc Functions
*
* @package wsevents
* @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3 or later
*
*/
class Div {
/**
* objectManager
*
* @var \TYPO3\CMS\Extbase\Object\ObjectManager
* @inject
*/
protected $objectManager;
/**
* Upload file
*
* @param \string $filename
* @return mixed false or file.png
*/
public function uploadFile($imageField) {
// Check file extension
if (empty($imageField['name']) || !self::checkExtension($imageField['name'])) {
return FALSE;
}
// create new filename and upload it
$basicFileFunctions = $this->objectManager->get('TYPO3\CMS\Core\Utility\File\BasicFileUtility');
$newFile = $basicFileFunctions->getUniqueName(
$imageField['name'],
\TYPO3\CMS\Core\Utility\GeneralUtility::getFileAbsFileName( self::getUploadFolderFromTca() )
);
#\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($newFile,'$newFile in uploadFile()');
if (\TYPO3\CMS\Core\Utility\GeneralUtility::upload_copy_move($imageField['tmp_name'], $newFile)) {
$fileInfo = pathinfo($newFile);
return $fileInfo['basename'];
}
return FALSE;
}
/**
* Check extension of given filename
*
* @param \string Filename like (upload.png)
* @return \bool If Extension is allowed
*/
public static function checkExtension($filename) {
$extensionList = $GLOBALS['TCA']['tx_wsevents_domain_model_events']['columns']['image']['config']['allowed'];
$fileInfo = pathinfo($filename);
if (!empty($fileInfo['extension']) && \TYPO3\CMS\Core\Utility\GeneralUtility::inList($extensionList, strtolower($fileInfo['extension']))) {
return TRUE;
}
return FALSE;
}
/**
* Read image uploadfolder from TCA
*
* @return \string path - standard "uploads/pics"
*/
public static function getUploadFolderFromTca() {
$path = $GLOBALS['TCA']['tx_wsevents_domain_model_events']['columns']['image']['config']['uploadfolder'];
if (empty($path)) {
$path = 'uploads/pics';
}
return $path;
}
}
Im Controller in der jeweiligen Action (hier updateAction) wird diese Funktion dann aufgerufen,
die Eigenschaft "image des Objects event mit dem neuen Dateinamen überschrieben (da sie ja bis jetzt noch das Array mit tmp_name, absolutem Pfad usw. enthält, das macht sich ja nicht so gut beim nachfolgendn SQL-Insert).
Anschließend wird das Object geupdatet, Erfolgsmeldung ausgegeben und zur vorherigen Action zurückgekehrt:
/**
* action update
*
* @param \smedjadotcom\Wsevents\Domain\Model\Events $events
* @return void
*/
public function updateAction(\smedjadotcom\Wsevents\Domain\Model\Events $events) {
$formData = $this->request->getArgument('events');
$imageField = $formData['image'];
$fileName = $this->div->uploadFile($imageField);
$events->setImage($fileName);
$this->eventsRepository->update($events);
$this->flashMessageContainer->add('Your Events was updated.');
$this->redirect( 'list' );
}
So funktioniert nun endlich der Bildupload,
arbeitet man mit FAL, würde das noch wieder etwas anders aussehen