Zum Inhalt springen

Ajax Image Upload - Speichern mit FAL

Erstellt am 9. Juli 2015 · 3 Antworten · letzte Antwort am 10. Juli 2015

Tags: Dateien & FAL, JavaScript & AJAX, TYPO3 6.x, Frage

metabolic119 ·

Hallo alle zusammen,

Ich habe folgendes Problem:

Ich habe beim fe_user ein Feld "Avatar" hinzugefügt und im Extensionbuilder als Feldtyp "Image" angegeben. Dass wird ja dann als FileReference behandelt.

Nun habe ich mit dem pluploader einen ImageUpload gebaut, mit dem das file hochgeladen wird.
Sieht so aus:

/**
	 * action uploadProfileImage
	 *
	 * @return void
	 */
	public function uploadProfileImageAction() {
		$fileName = $_FILES['file']['name'];
		$storageRepository = $this->objectManager->get('TYPO3\\CMS\\Core\\Resource\\StorageRepository');
		$storage = $storageRepository->findByUid('1');
		$relativFolderPath = $this->settings['profileImageRelativPath'] . '/' . $GLOBALS['TSFE']->fe_user->user['uid'];
		$fullFolderPath = $this->settings['profileImageFullPath'] . '/' . $GLOBALS['TSFE']->fe_user->user['uid'];
		$absolutePath = PATH_site . $fullFolderPath;
		$targetFolder = '';
		if (!file_exists($absolutePath)) {
			$targetFolder = $storage->createFolder($relativFolderPath);
		} else {
			$targetFolder = $storage->getFolder($relativFolderPath);
		}
		$fileName = $this->uploadData($fileName, $fullFolderPath);
		$relativFilePath = $relativFolderPath . '/' . $fileName;
		if ($storage->hasFile($relativFilePath)) {
			$movedNewFile = $storage->getFile($relativFilePath);
		} else {
			$movedNewFile = $storage->addFile($relativFilePath, $targetFolder, $fileName);
		}
		$newFileReference = $this->objectManager->get('\\MY\\OWN\\MODEL\\FileReference');
		$newFileReference->setFile($movedNewFile);
		$userObject = $this->feUserRepository->findByUid($GLOBALS['TSFE']->fe_user->user['uid']);

		$userObject->setAvatar($newFileReference);
		$this->feUserRepository->update($userObject);

		$persistenceManager = $this->objectManager->get('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\PersistenceManager');
		$persistenceManager->persistAll();

Das haut alles hin bis zum persistAll().
Dort bekomme ich dann folgende Exception:
"Table 'myextension.tx_EXTENSION_my_own_model_filereference' doesn't exist"

Meine FileReference Klasse sieht so aus:
Das habe ich in mehreren Threads so gesehen, dass man das so machen sollte.

class FileReference extends \TYPO3\CMS\Extbase\Domain\Model\FileReference{
    /**
     * uid of a sys_file
     *
     * @var integer
     */
    protected $originalFileIdentifier;

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

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

Er versucht offensichtlich, meine FileReference Klasse auf eine Table zu mappen was natürlich nicht funktionieren wird.
Jetzt meine Frage, wie mache ich das am besten? 🙂

Ist mein Ansatz überhaupt korrekt mit dem Storage das zu machen?

Also ganz allgemein, wie würdet ihr das lösen, einen Fileupload mit Ajax und das Bild soll dann bei einem Objekt gespeichert werden in der Uploadaction.

Vielen dank für eure Hilfe,
Metabolic

charhunter ·

Hallo Metabolic,

du musst noch folgendes Mapping in dein Typoscript (ext_typoscript_setup.txt) aufnehmen:

config.tx_extbase {
    persistence {
        classes {
            VENDOR\EXTENSION\Domain\Model\FileReference {
                mapping {
                    tableName = sys_file_reference
                    columns {
                        uid_local.mapOnProperty = file
                    }
                }
            }
        }
        # make sure ref_index is updated
        updateReferenceIndex = 1
    }
}

VENDOR und EXTENSION gegen deine Werte austauschen.

Hoffe so geht es.

Viele Grüße

charhunter

coder46 ·

eine Frage zu deiner uploadProfileImageAction(), hast du die in der createAction dann wieder aufgerufen ? und hast du da noch etwas anderes geändert oder hinzugefügt(TCA,Model,setup) ????

Ich versuche so ein ImageUpload schon seit Tagen und ich bekomme es einfach nicht hin.

Wenn du mir weiterhelfen könntest, würde ich mich sehr freuen.

Danke