[Frage] Frontend Image Upload TYPO3-Version: 8.7.1

  • 0 x
    15 Beiträge
    0 Hilfreiche Beiträge
    06. 06. 2017, 15:06

    Hallo Leute,

    ich hoffe ihr könnt mir weiterhelfen.

    Ich versuche in meinem Plugin einen Frontend Upload umzusetzen.

    So sieht mein Formular aus:
    [code]<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>[/code]

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

    Wie kann ich auf die Daten der hochgeladenen Datei zugreifen?

    lg
    EinradAsteroid


  • 1
  • getit getit
    Jedi-Ritter
    0 x
    137 Beiträge
    4 Hilfreiche Beiträge
    16. 06. 2017, 14:08

    Hallo,

    hier mal wie ich es gelöst habe.

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

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

    Da Extbase nicht mit dem Property
    1. /**
    2.   * foto
    3.   *
    4.   * @var \TYPO3\CMS\Extbase\Domain\Model\FileReference
    5.   * @cascade remove
    6.   */
    7. protected $foto = null;

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

    2. Eine FileReference-Klasse erstellen:

    1. <?php
    2.  
    3. namespace <MyNamespace>\<MyExtension>\Domain\Model;
    4.  
    5. class FileReference extends \TYPO3\CMS\Extbase\Domain\Model\FileReference {
    6.  
    7. /**
    8.   * uid of a sys_file
    9.   *
    10.   * @var integer
    11.   */
    12. protected $originalFileIdentifier;
    13.  
    14. /**
    15.   * @param \TYPO3\CMS\Core\Resource\ResourceInterface $originalResource
    16.   */
    17. public function setOriginalResource(\TYPO3\CMS\Core\Resource\ResourceInterface $originalResource) {
    18. parent::setOriginalResource($originalResource);
    19. $this->originalResource = $originalResource;
    20. $this->originalFileIdentifier = (int)$originalResource->getOriginalFile()->getUid();
    21. }
    22.  
    23. /**
    24.   * @param \TYPO3\CMS\Core\Resource\File $falFile
    25.   */
    26. public function setFile(\TYPO3\CMS\Core\Resource\File $falFile) {
    27. $this->originalFileIdentifier = (int)$falFile->getUid();
    28. }
    29. }

    3. TCA-Overrides

    1. <?php
    2.  
    3. use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
    4.  
    5. // Imageupload
    6. $GLOBALS['TCA']['tx_<extName>_domain_model_ansprechpartner']['columns']['foto']['config'] = ExtensionManagementUtility::getFileFieldTCAConfig('foto', [
    7. 'foreign_match_fields' => [
    8. 'fieldname' => 'foto',
    9. 'tablenames' => 'tx_<extName>_domain_model_ansprechpartner',
    10. 'table_local' => 'sys_file',
    11. ]
    12. ]);

    4. Im Controller musst du eine Methode definieren:

    1. /**
    2.   * @param $uploadFile
    3.   * @param $obj
    4.   * @param null $uid
    5.   * @param string $propertyName
    6.   */
    7. protected function setDateianhang($uploadFile, $obj, $uid = null, $propertyName = 'dateianhang') {
    8.  
    9. /** @var \TYPO3\CMS\Core\Resource\StorageRepository $storageRepository */
    10. $storageRepository = $this->objectManager->get('TYPO3\\CMS\\Core\\Resource\\StorageRepository');
    11. $storage = $storageRepository->findByUid('1'); // 1 ==> default to fileadmin
    12. $folder = '<folderToStore>';
    13. $targetFolder = null;
    14. if ($storage->hasFolder($folder)) {
    15. $targetFolder = $storage->getFolder($folder);
    16. } else {
    17. $targetFolder = $storage->createFolder($folder);
    18. }
    19. $originalFilePath = $uploadFile['tmp_name'];
    20. $newFileName = $uploadFile['name'];
    21.  
    22. if (file_exists($originalFilePath)) {
    23. $movedNewFile = $storage->addFile($originalFilePath, $targetFolder, $newFileName);
    24. $newFileReference = $this->objectManager->get('<MyNamespace>\<MyExtension>\Domain\Model\FileReference');
    25. $newFileReference->setFile($movedNewFile);
    26. $method = 'set' . ucfirst($propertyName); // dem Obj. eine FileReference hinzufügen
    27. $obj->{$method}($newFileReference);
    28. }
    29. }

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

    1. module.tx_<moduleName> {
    2. persistence {
    3. classes {
    4. <MyNS>\<MyModule>\Domain\Model\FileReference {
    5. mapping {
    6. tableName = sys_file_reference
    7. columns {
    8. uid_local.mapOnProperty = originalFileIdentifier
    9. }
    10. }
    11. }
    12. }
    13. }
    14. }

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

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

    Hoffe das beantwortet deine Frage ;)

  • 99grad 99grad
    T3PO
    0 x
    25 Beiträge
    1 Hilfreiche Beiträge
    28. 07. 2021, 09:05

    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

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

    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

  • 1