Zum Inhalt springen

extbase: Dateiupload im Frontend OHNE FAL

Erstellt am 28. Februar 2014 · 2 Antworten · letzte Antwort am 28. Februar 2014

Tags: Datei-Upload, TYPO3 6.x, Frage

jenses ·

Gibt es dafür irgendeine "saubere" extbase-Lösung?
Mit dem, was der extension_builder zusammenbastelt,
wird lediglich der Dateiname in das entsprechende Feld geschrieben, ein Upload erfolgt aber nicht.

Bei der Suche nach Infos heißt es: muß man komplett selber bauen.
Wie?

Die Code-Schnipsel im Netz, bei denen man per

 if ($_FILES['tx_myExtension_myPlugin']['name']['formObject']['formFieldName']) {
...

arbeitet, funktionieren nicht unter 6.1.x, da $_FILES immer leer ist.

Wo versteckt extbase die hochgeladene Datei? Wie kann ich darauf zugreifen?
Oder muß man wirklich den Upload und das Speichern komplett selber lösen,
wie z.B. im femanager per jquery.fineuploader ?

vince ·
jenses schrieb

funktionieren nicht unter 6.1.x, da $_FILES immer leer ist.

Ich habe eine Extbase extension unter TYPO3 6.1.7 laufen, und da kann man auf $_FILES zugreifen.
(im Controller, in der update-Action)

$_FILES['tx_myExtension_myPlugin']['name']['formObject']['formFieldName']

im Formular hab ich das Feld so eingebunden:

<f:form.upload property="formFieldName" />

Ich schätze mal, dass da woanders etwas nicht stimmt.

jenses · · Beste Antwort
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