Zum Inhalt springen

Frontend Image Upload

Erstellt am 6. Juni 2017 · 2 Antworten · letzte Antwort am 28. Juli 2021

Tags: TYPO3 8, Frage

EinradAsteroid ·

Hallo Leute,

ich hoffe ihr könnt mir weiterhelfen.

Ich versuche in meinem Plugin einen Frontend Upload umzusetzen.

So sieht mein Formular aus:

<form method="post"  enctype="multipart/form-data" action="<f:uri.page>page link</f:uri.page>" id="test">
    <div class="form-group">
        <label for="exampleInputFile">File input</label>
        <f:form.upload property="exampleInputFile" />
        <p class="help-block">Example block-level help text here.</p>
    </div>
    <button type="submit" class="btn btn-default">Hochladen</button>
</form>

Mit $_FILES kann ich nicht auf die hochgeladenen Daten zugreifen.

Wie kann ich auf die Daten der hochgeladenen Datei zugreifen?

lg
EinradAsteroid

getit ·

Hallo,

hier mal wie ich es gelöst habe.

1. Das '<f:form.upload/>' nicht mit Property sondern nur einem Name:

<f:form.upload name="foto" class="imageupload"/>

Da Extbase nicht mit dem Property

/**
  * foto
  * 
  * @var \TYPO3\CMS\Extbase\Domain\Model\FileReference
  * @cascade remove
  */
  protected $foto = null;

umgehen kann - bzw. das Form liefert das Property eben nicht als FileReference.

2. Eine FileReference-Klasse erstellen:

<?php

namespace <MyNamespace>\<MyExtension>\Domain\Model;

class FileReference extends \TYPO3\CMS\Extbase\Domain\Model\FileReference {

  /**
   * uid of a sys_file
   *
   * @var integer
   */
   protected $originalFileIdentifier;

  /**
   * @param \TYPO3\CMS\Core\Resource\ResourceInterface $originalResource
   */
  public function setOriginalResource(\TYPO3\CMS\Core\Resource\ResourceInterface $originalResource) {
    parent::setOriginalResource($originalResource);
    $this->originalResource = $originalResource;
    $this->originalFileIdentifier = (int)$originalResource->getOriginalFile()->getUid();
  }

  /**
   * @param \TYPO3\CMS\Core\Resource\File $falFile
   */
  public function setFile(\TYPO3\CMS\Core\Resource\File $falFile) {
    $this->originalFileIdentifier = (int)$falFile->getUid();
  }
}

3. TCA-Overrides

<?php

use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;

// Imageupload
$GLOBALS['TCA']['tx_<extName>_domain_model_ansprechpartner']['columns']['foto']['config'] = ExtensionManagementUtility::getFileFieldTCAConfig('foto', [
  'foreign_match_fields' => [
    'fieldname' => 'foto',
    'tablenames' => 'tx_<extName>_domain_model_ansprechpartner',
    'table_local' => 'sys_file',
  ]
]);

4. Im Controller musst du eine Methode definieren:

/**
  * @param $uploadFile
  * @param $obj
  * @param null $uid
  * @param string $propertyName
  */
protected function setDateianhang($uploadFile, $obj, $uid = null, $propertyName = 'dateianhang') {

  /** @var \TYPO3\CMS\Core\Resource\StorageRepository $storageRepository */  		
  $storageRepository = $this->objectManager->get('TYPO3\\CMS\\Core\\Resource\\StorageRepository');
  $storage = $storageRepository->findByUid('1');	// 1 ==> default to fileadmin
  $folder = '<folderToStore>';
  $targetFolder = null;
  if ($storage->hasFolder($folder)) {
    $targetFolder = $storage->getFolder($folder);
  } else {
    $targetFolder = $storage->createFolder($folder);
  }
  $originalFilePath = $uploadFile['tmp_name'];
  $newFileName = $uploadFile['name'];

  if (file_exists($originalFilePath)) {
    $movedNewFile = $storage->addFile($originalFilePath, $targetFolder, $newFileName);
    $newFileReference = $this->objectManager->get('<MyNamespace>\<MyExtension>\Domain\Model\FileReference');
    $newFileReference->setFile($movedNewFile);
    $method = 'set' . ucfirst($propertyName);   // dem Obj. eine FileReference hinzufügen
    $obj->{$method}($newFileReference);
  }
}

5. In der Configuration/TypoScript/setup.ts noch ergänzen:

module.tx_<moduleName> {
  persistence {
    classes {
      <MyNS>\<MyModule>\Domain\Model\FileReference {
        mapping {
	  tableName = sys_file_reference
	  columns {
	    uid_local.mapOnProperty = originalFileIdentifier
	  }
	}
      }
    }
  }
}

6. Und als letztes musst du noch dein addAction() anpassen:

...
$requestArgs = $this->request->getArguments();
  if ($requestArgs['foto']['name']) {
    $this->setDateianhang($requestArgs['foto'], $ansprechpartner, null, 'foto', 'ansprechpartner');
  }
...

Hoffe das beantwortet deine Frage 😉

99grad ·

Für alle, die eine Lösung zum Thema "Wie konvertiere ich ein Bild, das der User im Frontend hochgeladen hat in ein FAL und hänge es an mein Model?" noch ein Tipp:
Wir haben im TER die Extension nnhelpers veröffentlicht, die genau solche Dinge extrem vereinfacht. Dort gibt es z.B. einen Einzeiler

\nn\t3::Fal()->setInModel( $model, 'fieldname', 'file.jpg');

Der übernimmt den Rest: SysFile erzeugen, SysFileReference erzeugen, ans Model attachen... sehr praktisch.

Hier die Infos und Links zu der Doku
http://labor.99grad.de/nnhelpers-im-typo3-repository-ter-veroeffentlicht/

Und hier der direkte Link zu den Methoden von \nn\t3::Fal()
https://labor.99grad.de/typo3-docs/nnhelpers/de/Helpers/Classes/fal.html