Zum Inhalt springen

Datei Upload mit StorageRepository benennt Dateien um

Erstellt am 14. November 2017 · 3 Antworten · letzte Antwort am 15. November 2017

Tags: Dateien & FAL, Datei-Upload, TYPO3 7, Frage

Power-Poler ·

Hallo,
Versuche mit gerade an einem eigenen Datei Upload.

public function saveFormAction() {
    $newPDFPath = 'user_upload/User_Dateien/'.$GLOBALS['TSFE']->fe_user->user['username'].'/';
	\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($_FILES);
	//var_Dump($_FILES['tx_usercontrol_user_control_usercreatetext']['name']['formpdf'][0]);
	var_Dump($_FILES['tx_usercontrol_user_control_usercreatetext']['type']['formpdf'][0] == 'application/pdf');
	var_Dump($_FILES['tx_usercontrol_user_control_usercreatetext']['name']['formpdf'][0] and $_FILES['tx_usercontrol_user_control_usercreatetext']['type']['formpdf'][0] == 'application/pdf');
	if ($_FILES['tx_usercontrol_user_control_usercreatetext']['name']['formpdf'][0] and $_FILES['tx_usercontrol_user_control_usercreatetext']['type']['formpdf'][0] == 'application/pdf') {

        //be careful - you should validate the file type! This is not included here       
        $tmpName = $_FILES['tx_usercontrol_user_control_usercreatetext']['name']['formpdf'][0];
        $tmpFile  = $_FILES['tx_usercontrol_user_control_usercreatetext']['tmp_name']['formpdf'][0];

		$storageRepository = $this->objectManager->get('TYPO3\\CMS\\Core\\Resource\\StorageRepository');
		$storage = $storageRepository->findByUid('1'); //this is the fileadmin storage
		//build the new storage folder
		if(!$storage->hasFolder($newPDFPath)){
			$targetFolder = $storage->createFolder($newPDFPath);
		}
		else {
			$targetFolder = $storage->getFolder($newPDFPath); //getFolder steht zwar nicht in der API, Funktioniert aber im Gegenzug zu anderen Methoden, die in der API stehen. :/
		}
		$newFileName = $tmpName;
		$Path=$newPDFPath.$tmpName;
		var_Dump($storage->hasFile($Path));
		var_Dump($tmpFile);
		$movedNewFile = $storage->addFile($tmpFile, $targetFolder, $newFileName);
	}

Nunja, eine Datei mit Namen: „Ich bin eine Datei.pdf“
Wird zu: „ich_bin_eine_datei.pdf“
Des Weiteren erzeugt die Methode addFile Kopien einer Datei, wenn der Name bereits Existiert.
„ich_bin_eine_datei01.pdf“ usw…
Wie bekomme ich ihn jetzt dazu, die Datei Richtig zu benennen, und statt eine Kopie anzulegen einen Error ausgibt?
hasFile Funktioniert leider nicht, da die Datei im Ordner ja anderes heißt, und wenn er anfängt kopieren anzulegen findet er natürlich nichts mehr, und gibt einfach FALSE zurück…
Die API Doku ist fast nicht zu gebrauchen, in der Doku steht return Folder, es wird aber ein String zurückgegen, genauso wenn Parameter String dasteht, will er einen Folder, usw. Die Beschreibung von addFile will 3 x String, wenn ich ihr aber 3 Strings gebe, meckert er, das er einen Folder möchte…usw..
https://api.typo3.org/typo3cms/7/html/class_t_y_p_o3_1_1_c_m_s_1_1_core_1_1_resource_1_1_folder.html
Ich Orientiere mich nach dieser Anleitung:
http://t3-developer.com/1/ext-programmierung/techniken-in-extensions/fal-dateiupload-im-frontend/
//build the new storage folder
$targetFolder = $storage->createFolder($newImagePath);
Ist zwar eine schöne Methode, leider liefert sie Oops, an Error usw, wenn der Order bereits existiert… Hat sich hier so viel geändert an der Classe?
Hoffentlich habt ihr noch eine Idee.
Schon mal Danke für eine Antwort
Mfg
Power-Poler

Power-Poler · · Beste Antwort

Habe die Falsche Classe verwendet, es ist diese:
https://api.typo3.org/typo3cms/7/html/class_t_y_p_o3_1_1_c_m_s_1_1_core_1_1_resource_1_1_resource_storage.html

Groß und Kleinschreibung ist ebenfalls gelöst, Filelist->fileadmin(rechtsklick)->Edit->Configuration->"Use case sensetive identifiers"
Nur diese verdammten Unterstriche habe ich noch nicht weg bekommen.
Sollte aber auch keine Rolle mehr spielen.
In der Doku wurde die Methode addFile richtig Erklärt, und ich konnte anstatt Rename, Replace eintragen:
$movedNewFile = $storage->addFile($tmpFile, $targetFolder, $newFileName, \TYPO3\CMS\Core\Resource\DuplicationBehavior::REPLACE);

Norman2k ·

Nur mal so aus Interesse, wieso ist es dir so wichtig, dass der Dateiname erhalten bleibt? Wenn ich manchmal sehe, was Kunden für fiese Zeichen in Dateinamen haben, bin ich sehr glücklich darüber, dass TYPO3 mir die Arbeit abnimmt, solche Zeichen raus zu filtern 😉

Power-Poler ·

War da noch der Meinung, dass ich Prüfen müsste, ob die Datei bereits existiert, und wenn die Datei anderes im Ordner benannt ist, wird die Prüfung immer auf FALSE hinauslaufen.
Durch die richtige Classen Doku und REPLACE konnte ich das ja alles Typo3 überlassen.
Groß und Kleinschreibung ist aber sicher nicht das Problem bei der Dateibenennung, wenn er nun weiterhin Sonderzeichen und Blödsinn rausfillter ist es in Ordnung.