[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 ;)

  • 1