Upload Script - Uploadify

Hey zusammen, ich verzweifel die letzten Tage an meinem Uploadscript, welches ich über ein Plugin nach der Bestellung einblende. Wenn ich das Script direkt in einen Ordner von Shopware packe, ohne Plugin z.B. direkt unter /up_script so funktioniert alles bestens… Ich hoffe ihr könnt mir weiterhelfen. Zur Dateistruktur - Haupt-Plugin-Ordner: /var/www/engine/Shopware/Plugins/Community/Frontend/OrderUpload abgehend vom Plugin-Ordner dann: Views/frontend/plugins/OrderUpload/_resources/js (java dateien) Views/frontend/plugins/OrderUpload/_resources/uploadify (flash, bilder, upload.php) Views/frontend/plugins/OrderUpload/template/index.tpl Die index.tpl sieht folgendermaßen aus: [code] {block name=‘frontend_checkout_finish_teaser’ prepend} Uploadify - Single and Multiple Sample

Single File Upload

Display speed

You have a problem with your javascript
Start Upload | Clear Queue

{/block}
[/code]

Alle Pfade zu den benötigten Dateien stimmen, diese habe ich überprüft. Der Upload funktioniert optisch auch, aber es liegt nachher keine Datei in dem Ordner.

Jeder versuch zu Debuggen oder aus der upload.php Variablen auszugeben um die Pfade anzuschauen scheitern. Ich weiß einfach nicht weiter…

Hier noch der Code der Upload.php (welcher auch außerhalb von Shopware 1A funktioniert.

[code]

<?php // JQuery File Upload Plugin v1.4.1 by RonnieSan - (C)2009 Ronnie Garcia if (!empty($_FILES)) { $tempFile = $_FILES['Filedata']['tmp_name']; $targetPath = $_SERVER['DOCUMENT_ROOT'] . $_GET['folder'] . '/'; $targetFile = str_replace('//','/',$targetPath) . $_FILES['Filedata']['name']; // Uncomment the following line if you want to make the directory if it doesn't exist // mkdir(str_replace('//','/',$targetPath), 0755, true); move_uploaded_file($tempFile,$targetFile); } switch ($_FILES['Filedata']['error']) { case 0: $msg = "No Error"; break; case 1: $msg = "The file is bigger than this PHP installation allows"; break; case 2: $msg = "The file is bigger than this form allows"; break; case 3: $msg = "Only part of the file was uploaded"; break; case 4: $msg = "No file was uploaded"; break; case 6: $msg = "Missing a temporary folder"; break; case 7: $msg = "Failed to write file to disk"; break; case 8: $msg = "File upload stopped by extension"; break; default: $msg = "unknown error ".$_FILES['Filedata']['error']; break; } $setupFile = "uploadVARresults.txt"; $fh = fopen($setupFile, 'w'); if ($fh) { $stringData = "path: ".$_GET['folder']."\n targetFile: ".$targetFile."\n Error: ".$_FILES['Filedata']['error']."\nError Info: ".$msg; } fwrite($fh, $stringData); fclose($fh); echo '1'; ?>

[/code]

Wird die upload.php überhaupt aufgerufen? Baue doch mal ganz am Anfang der Datei ein mail("deine\_mailadresse","test",print\_r($\_FILES,true)); in den Code ein - dann solltest du ja eine eMail bekommen, sobald das Upload-Script irgendwie angetriggert wird. Das wäre nun erst einmal Step 1 - zu prüfen, ob das UPload-Script überhaupt vom Flash aufgerufen werden kann.

Hallo Stefan, dank für deinen super Tipp :wink: Jetzt kann ich ja doch debuggen, und das ganze per Email. Super… hihi Email kam an. Folgender Inhalt: Array ( [Filedata] =\> Array ( [name] =\> gimp.jpg [type] =\> application/octet-stream [tmp\_name] =\> /tmp/phpKVTo7E [error] =\> 0 [size] =\> 46669 ) ) Jetzt habe ich mir noch eine Email schicken lassen, um den Pfad herauszufinden, wo die Datei hingeschrieben wird: /kunden/117539_78141/webseiten/testshop/shopware.php/sViewport,checkout/uploads/Ausgabe.pdf Das ist natürlich falsch. Hier sollte dies stehen: /kunden/117539_78141/webseiten/testshop/uploads/Ausgabe.pdf Wie bekomme ich das am einfachsten hin? Soll ich per replace einfach den Teil entfernen? /shopware.php/sViewport,checkout So wird ja im default der Pfad ermittelt: $targetPath = $\_SERVER['DOCUMENT\_ROOT'] . $\_GET['folder'] . '/'; $targetFile = str\_replace('//','/',$targetPath) . $\_FILES['Filedata']['name'];

Hi, die Server-Variable „$_SERVER[‚DOCUMENT_ROOT‘]“ solltest du lieber nicht verwenden, da diese unter Umständen nicht stimmen kann. Du solltest daher lieber Shopware()->DocPath() verwenden. Das gibt dir immer den richtigen Pfad zurück. :wink: Außerdem sollte da eine Überprüfung rein, ob es sich um eine Bild-Datei handelt, sonst kann nach dein Shop durch das Hochladen einer PHP-Datei gehackt werden. :frowning: Viele Grüße Heiner

Hey Heiner, danke für deine Info. leider ist die PHP ja nicht direkt in einem Controller oder andere Shopwaredatei eingebunden. Daher habe ich ja die Function shopware() nicht! Danke

Hey, ich konnte nun das Porblem lokalisieren. Es kommt nicht aus \_SERVER['DOCUMENT\_ROOT']. Hier wird der korrekte Wert geliefert, es kommt aus dem GET Parameter. Ich habe zum Test mal im JavaScript für den folder: 123123 angegeben. Ruf man nun über _GET[‘folder’] den Wert ab, steht folgendes drin: shopware.php/sViewport,checkout/123123 Woran liegt das?

Ich würde das anders machen und das UPload-Script in eine Controller-Action packen - also eigene Controller: public function uploadAction(){ $this-\>View()-\>setTemplate(); $file = $\_FILES['Filedata']['tmp\_name']; $fileExtension = explode(".",$\_FILES['Filedata']['name']); $fileExtension = $fileExtension[count($fileExtension)-1]; if (!in\_array(array("jpg","png"),$fileExtension){ throw new Enlight\_Exception("Invalid file type"); } $uploadDirectory = Shopware()-\>DocPath()."/uploads"; $filenew = $uploadDirectory."/".md5(uniqid(rand())).".".$fileExtension; move\_uploaded\_file($file,$filenew); } Dann statt dem Upload-Script {url controller=deinController action=upload} als Upload-Target!

Morgen Stefan, ich bekomme nun einen Paser Error: Parse error: syntax error, unexpected '{' in /kunden/117539\_78141/webseiten/testshop/engine/Shopware/Plugins/Community/Frontend/OrderUpload/OrderUpload.php on line 16 Bezogen auf diese If - Stelle: if (!in\_array(array("jpg","png"),$fileExtension){ throw new Enlight\_Exception("Invalid file type"); } Aber die Klammersetzung ist doch korrekt! Danke

Da fehlt noch ein ) am Ende der IF-Bedingung! Welche IDE benutzt du denn? Solche FEhler sollten dir dort eigentlich direkt angezeigt werden

[quote=„Stefan Hamann“]Da fehlt noch ein ) am Ende der IF-Bedingung! Welche IDE benutzt du denn? Solche FEhler sollten dir dort eigentlich direkt angezeigt werden[/quote] Danke, hab es noch selber gefunden. Bis jetzt noch gar keine. Ich weiß, ich sollte mal eine benutzen. Aber ich arbeite gerade mit Ubuntu und scite (editor) :confused: Wenn ich jetzt den Controller direkt über den Browser öffen, kommt folgende Meldung: Invalid file type in Shopware/Plugins/Community/Frontend/OrderUpload/OrderUpload.php on line 17 Stack trace: #0 Enlight/Controller/Action.php(55): Shopware\_Controllers\_Frontend\_OrderUpload-\>uploadAction() #1 Enlight/Controller/Dispatcher/DispatcherDefault.php(329): Enlight\_Controller\_Action-\>dispatch('uploadAction') #2 Enlight/Controller/Front.php(88): Enlight\_Controller\_Dispatcher\_DispatcherDefault-\>dispatch(Object(Enlight\_Controller\_Request\_RequestHttp), Object(Enlight\_Controller\_Response\_ResponseHttp)) #3 Shopware/Bootstrap.php(21): Enlight\_Controller\_Front-\>dispatch() #4 Enlight/Application.php(69): Shopware\_Bootstrap-\>run() #5 shopware.php(6): Enlight\_Application-\>run() #6 {main} Wenn ich es über das Upload Script benutze, geht es auch nicht.

Lade dir mal die Trial-Version von PHPStorm runter, oder notfalls Zend Studio 5.5 - glaub mir, das spart dir einiges an Arbeit und Nerven. “Invalid file type in Shopware/Plugins/Community/Frontend/OrderUpload/OrderUpload.php on line 17” Ja und was steht dort in Zeile 17?!

[quote=“Stefan Hamann”]Lade dir mal die Trial-Version von PHPStorm runter, oder notfalls Zend Studio 5.5 - glaub mir, das spart dir einiges an Arbeit und Nerven. “Invalid file type in Shopware/Plugins/Community/Frontend/OrderUpload/OrderUpload.php on line 17” Ja und was steht dort in Zeile 17?![/quote] Ja, den Beitrag über PHPStrom habe ich von dir gelesen. Wollte ich mir eig. auch kaufen, ist ja nicht teuer. Wollte aber noch auf dein angekündigtes Tutorial warten :wink: Sorry, es betrifft diese Zeile: throw new Enlight_Exception(“Invalid file type”); Danke für deine Hilfe.

Achso - ja direkt aufrufen kannst du das ja garnicht - das prüft ja aus Sicherheitsgründen den Dateityp - und wenn keine Datei übergeben wurde, ist das auch falsch :wink: Begrenzt ist das derzeit auf png und jpg Dateien…

Hi, ich verwende ich immer Zend für den Datei-Upload. Damit kann man sauber alle Fehler abfangen: :wink: try { $upload = new Zend\_File\_Transfer\_Adapter\_Http(); if($upload-\>isUploaded()) { $upload-\>setDestination($uploadDir); $upload-\>addValidator('Extension', false, array('jpg', 'jpeg', 'png', 'gif')); if (!$upload-\>isValid()) { $message = $upload-\>getMessages(); $message = implode(" \n", $message); throw new Exception($message); } if(!empty($id)) { $oldFiles = glob($uploadDir.'wizard\_'.$id.'\_\*'); if(!empty($oldFiles)) { foreach ($oldFiles as $oldFile) { if (file\_exists($oldFile)) { @unlink($oldFile); } } } } } if (empty($id)) { //... } if($upload-\>isUploaded()) { $image = 'wizard\_'.$id.'\_'.$upload-\>getFileName(null, false); $upload-\>addFilter('Rename', $uploadDir.$image); if (!$upload-\>receive()) { $message = $upload-\>getMessages(); $message = implode(" \n", $message); throw new Exception($message); } $data['image'] = $image; } } catch (Exception $e) { $message = $e-\>getMessage(); } Viele Grüße Heiner

Leider erhalte ich jetzt einen I/O Fehler:

So, jetzt bin ich einen großen Schritt weiter. Mein Code sieht nun so aus, und ich debugge fast jede Varibale: $this-\>View()-\>setTemplate(); $file = $\_FILES['Filedata']['tmp\_name']; $fileExtension = explode(".",$\_FILES['Filedata']['name']); $fileExtension = $fileExtension[count($fileExtension)-1]; mail("ottscho@ottscho.de","fileextension",print\_r($fileExtension,true)); mail("ottscho@ottscho.de","test2",print\_r($file,true)); if (!in\_array(array("jpg","png"),$fileExtension)){ mail("ottscho@ottscho.de","fehler",print\_r($file,true)); throw new Enlight\_Exception("Invalid file type"); } $uploadDirectory = Shopware()-\>DocPath()."/uploads"; $filenew = $uploadDirectory."/".md5(uniqid(rand())).".".$fileExtension; mail("ottscho@ottscho.de","file",print\_r($file,true)); mail("ottscho@ottscho.de","newfile",print\_r($filenew,true)); move\_uploaded\_file($file,$filenew); Ich laufe immer in die IF, obwohl die Extension, welche ich hochlade jpg ist. Woran liegt das? EDIT: Hab es rausgefunden. Ein dreher hat sich versteckt :wink: if (!in\_array(array("jpg","png"),$fileExtension))

Hallo Stefan, jetzt benötige ich noch einen Tipp. Ich würde gerne in dem Dateinamen bei der Speicherung noch die Bestellnummer vorne anhängen. Aber wie komme ich im Controller wieder zu der Variable? Über GET kann ich es nicht mitgeben, da dann der Java Code nicht mehr stimmt und es mir zerhauen wird :confused: Auf die Smarty-Variable kann ich ja nicht zugreifen, oder? {$sBasket.ordernumber} Hier noch mal der komplette Code: [code]<?php class Shopware_Controllers_Frontend_OrderUpload extends Enlight_Controller_Action
{

	public function indexAction()
		{
			
		}
	
	public function uploadAction()
		{
		$this->View()-\>setTemplate(); $file = $\_FILES['Filedata']['tmp\_name']; $fileExtension = explode(".",$\_FILES['Filedata']['name']); $fileExtension = $fileExtension[count($fileExtension)-1]; mail("ottscho@ottscho.de","fileextension",print\_r($fileExtension,true)); mail("ottscho@ottscho.de","test2",print\_r($file,true)); if (!in\_array($fileExtension,array("jpg","png"))){ mail("ottscho@ottscho.de","fehler",print\_r($file,true)); throw new Enlight\_Exception("Invalid file type"); } $uploadDirectory = Shopware()-\>DocPath()."uploads"; mail("ottscho@ottscho.de","pfad",print\_r($uploadDirectory,true)); $filenew = $uploadDirectory."/".md5(uniqid(rand())).".".$fileExtension; mail("ottscho@ottscho.de","file",print\_r($file,true)); mail("ottscho@ottscho.de","newfile",print\_r($filenew,true)); move\_uploaded\_file($file,$filenew); echo '1'; } } ?\> [/code]

Speichere die Bestellnummer doch in der Session und frage die von da wieder ab? Also in der Funktion, die das Upload-Widget integriert. Shopware()->Session()->bestellnummer = XYZ; Und im Upload-Script: $bestellnummer = Shopware()->Session()->bestellnummer;

danke, soweit geht es. Aber ich stehe gerade mal wieder voll auf dem Schlauch. Wie komme ich in der Funktion an die Bestellnummer? public static function onPostDispatch(Enlight\_Event\_EventArgs $args) { $request = $args-\>getSubject()-\>Request(); $response = $args-\>getSubject()-\>Response(); $view = $args-\>getSubject()-\>View(); $config = Shopware()-\>Plugins()-\>Frontend()-\>OrderUpload()-\>Config(); $view-\>OrderUploadConfig = $config; Shopware()-\>Session()-\>bestellnummer = "123123"; if ($request-\>getActionName()=="finish"){ $view-\>addTemplateDir(dirname(\_\_FILE\_\_).'/Views/'); $view-\>extendsTemplate('frontend/plugins/OrderUpload/template/index.tpl'); } }

Unter dem gleichen Namen, wie die Variable im Template adressiert wird - also wenn du die im Template z.B. über $ordernumber abfragst - holtst du die im Post-Dispatch via $view->ordernumber