[addon multiplefileupload] MultipleFileUpload – form control

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
despiq
Člen | 320
+
0
-

potvrzuju funkcni MFU na Linuxu apache, PHP 5.3.2, nette 1.0 dev pro 5.3
i kdyz to uz druhej den resim proc mi to nefunguje a ted sem na to konecne prisel,
kdyz je domena pod ssl tak to proste nejde a hazi to IO error, takova stupidni vec, melo me to napadnout hned

Editoval despiq (16. 4. 2010 19:03)

Honza Kuchař
Člen | 1662
+
0
-

To prý jde vyřešit. Někde jsem o tom četl. Hledej Uploadify + https nebo Uploadfy+ssl

despiq
Člen | 320
+
0
-

staci uvest absolutni adresu ve script ne? nebo to stacit nebude? :)

Honza Kuchař
Člen | 1662
+
0
-

Tak to nevím, budeš muset hledat, ale pak určitě napiš co jsi našel. Přidám upozornění a řešení na wiki.

despiq
Člen | 320
+
0
-

tak to nestaci,
podle toho co jsem nasel tak jedina podle meho spravna cesta je mit certifikat podepsany uznavanou certifikacni autoritou, zkousel sem cacert ktery je zadarmo ale budto delam neco spatne nebo to s nim proste nejde, bohuzel ale ted zatim takovy certifikat nemam tak ani nemuzu rict jestli to opravdu funguje ale podle toho co jsem cetl by melo

takze self signed certifikaty a flash nejdou dohromady

mozna by mohlo byt alternativou predani session id do flashe a preposlani na ne ssl verzi ktera pak zas to idcko podstrci a pracuje dal, je to podle meho dost kostrbaty reseni ale mozna budu nucen tou cestou jit, i kdyz certifikat na rok za 2k asi stoji za to obetovat spis nez se s tim crcat

taky mozna stoji za zamysleni zdali je to opravdu nutne, preci jen predstava ze na nejakem z datovych uzlu pres ktere se hope k serveru sedi nejakej manik a sleduje tam tok informaci prave k moji aplikaci je opravdu absurdni, bezpecnost predevsim ze …

Editoval despiq (19. 4. 2010 1:21)

Honza Kuchař
Člen | 1662
+
0
-

MFU url nekotroluje. Pokud nasměruješ jakýkoli požadavek na index.php, který vypadá jako od Uploadify, tak si ho stáhne. Zpracování se poté už může dít přes SSL (odeslání formuláře). Zase tak veliké bezpečnostní riziko bych v tom neviděl.

despiq
Člen | 320
+
0
-

ja v tom taky bezpecnostni diru nevidim ale nelibi se mi to reseni, protoze kdyz mam aplikaci s prihlaseni tak se user zaloguje na ssl verzi a jde nahravat obrazky jenze flash to posle na ne ssl verzi kterou prohlizec bere jako jinou stranku a tudiz na ni neni user zalogovanej, takze preposlat sessionid a asi v bootstrapu to kontrolovat noa jakmile se soubory nahrajou tak se to odesle uz zase v ty ssl verzi, me se jen nelibi to preposlani sessionid

Honza Kuchař
Člen | 1662
+
0
-

Projdi si zdrojáky MFU. Ty soubory do tempů ukládá ještě před startem sessions (právě kvůli flashi). Zpracování, tzn. přesun z tempů kam ty chceš už se perovádí na stránce se ssl (onSubmit)

EDIT: MFU si můžeš poměrně jednoduše upravit, aby kontrolovalo tokenID už před přesunem uploadu do tempů. V této chvíli** do tempů **přijme úplně cokoliv (stejně jako to dělá PHPko)…

Editoval honzakuchar (19. 4. 2010 13:17)

Oggy
Člen | 306
+
0
-

netuší někdo kde by mohl být problém?

MFU po vybrání souborů k uplodu zobrazí jejich frontu.. ale při odeslání formuláře se někam ztratí .. v onsubmit metodě je form už prázdný.. žádná chybová hláška..

chtěl bych poprosit o nasměrování, kde hledat.. díky

Honza Kuchař
Člen | 1662
+
0
-

Zkontroloval bych co dělá model. Zda ukládá…

iguana007
Člen | 970
+
0
-

prohledej si temp složky jestli tam ty soubory někde nejsou. Ja měl nedávno problém v tom, že jsem si uploadované soubory přebíral ve špatné složce a tím pádem se mi jakoby nic nenahrálo.

Honza Kuchař
Člen | 1662
+
0
-

iguana007 napsal(a):

prohledej si temp složky jestli tam ty soubory někde nejsou. Ja měl nedávno problém v tom, že jsem si uploadované soubory přebíral ve špatné složce a tím pádem se mi jakoby nic nenahrálo.

Jak to myslíš?

P.S.: Ty soubory se z tempu mažou. Budeš muset to mazání zakomentovat v modelu.

Editoval honzakuchar (21. 4. 2010 9:57)

Oggy
Člen | 306
+
0
-

honzakuchar napsal(a):

Zkontroloval bych co dělá model. Zda ukládá…

no hrabu se v tom.. a on je prázdný už httprequest .. tedy Environment::getHttpRequest()->getFiles() …
obsahuje pole httpupploadfile ..ale všechno file,size atd je prázdné..

Honza Kuchař
Člen | 1662
+
0
-

Tak pak bude asi chyba už někde při posílání toho dotazu. Budeš muset debugovat, u mně je to ok.

Oggy
Člen | 306
+
0
-

No debugger se mi nějak nepodařilo rozchodit.. ale to není sem..
zajímavé je, že pokud nastavím uploadify auto upload true..tak files odešle.. pokud na false..tak jsou files prázdné.

Honza Kuchař
Člen | 1662
+
0
-

Tak to bude asi chyba na straně klienta. (někde v JavaScriptu)

saimons
Člen | 293
+
0
-

Tak jsem chtel pouzit tento doplnek a skoncil jsem hned na zacatku, hlasi mi to chybu:

Declaration of MultipleFileUpload::validateFileSize() should be compatible with that of NFileUpload::validateFileSize()

Nette 0.9.4
Dibi 1.2
PHP 5.3 (WAMPSERVER)

Honza Kuchař
Člen | 1662
+
0
-

Mrknu na to. Ovšem odstraněním této chyby už nebude doplněk použitelný se staršími verzemi. (ale to snad nevadí) Ale jde pouze o tom, že musí být stejné parametry funkce MultipleFileUpload::validateFileSize, jako ta funkce nadřazená NFileUpload::validateFileSize. // EDIT: pokud to budeš opravovat, tak mi prosím pošli patch, ať to nedělám zbytečně.

Editoval honzakuchar (2. 5. 2010 20:05)

saimons
Člen | 293
+
0
-

Ta chyba neni na strane pluginu, ja jsem spatne udelal prespani na prefixovou verzi.

Editoval saimons (2. 5. 2010 21:12)

Honza Kuchař
Člen | 1662
+
0
-

aha

raia
Člen | 25
+
0
-

saimons napsal(a):

Ta chyba neni na strane pluginu, ja jsem spatne udelal prespani na prefixovou verzi.

Můžeš napovědět, kde byla chyba? Potýkám se s tím samým…

Strict Standards: Declaration of MultipleFileUpload::validateFilled() should be compatible with that of Nette\Forms\FileUpload::validateFilled() in C:\xampp\htdocs\BTG\app\models\MultipleFileUpload\MultipleFileUpload.php  on line 43

našel jsem jen, že je to bug u autoloadu :( http://bugs.php.net/46851

saimons
Člen | 293
+
0
-

No je potreba projit vsechny volani funkci a prepsat je spravne. Ale nakonec jsem to nepouzil, takze vice poradit nemuzu, iplmentoval jsem si swfupload

Vitek Jezek
hledá kolegy | 285
+
0
-

jen potvrdim nefunkcnost na macu (je to ale takove zvlastni) – u jednotlivych souboru je error code 4, navic se me zda, ze posila flash spatne hlavicky (neposila flashovske, ale prohlizece).
Skoro bych rekl, ze to neni problem implementace do Nette, ale proste problem uplodify. Zato swfupload na macu chodi vyborne.

Nechtel by se saimons podelit s komunitou o svuj vytvor? : )

Honza Kuchař
Člen | 1662
+
0
-

Víte co, rozdělíme si to, já udělám podporu pro dynamickou klientskou část. (připojí se prostě jako modul a automatickými fallbacky na uživatelsky méně přívětivou verzi) A vy doděláte implementaci pro swfupload. :-)
Ale rozhodně, přepsat MFU v současné chvíli na swfupload bude určitě na chvíli, protože MFU neřeší bugy Uploadify, ale flashe.

Editoval Honza Kuchař (16. 5. 2010 19:32)

Ondřej Kubíček
Člen | 494
+
0
-

Mám ten samý problém co Oggy, po odeslání formuláře je pole z getValues() prázdné, soubory mám aktuální z svn…

Honza Kuchař
Člen | 1662
+
0
-

Těžko říct, bude třeba debugovat.

hrach
Člen | 1838
+
0
-

tak nevím, ale na svn podle mě už aktuální soubory nebudou. nebo jo?

Honza Kuchař
Člen | 1662
+
0
-

Jak aktuální? Proč by nebyly aktuální? Jak se pozná, že jsou neaktuální?

Oggy
Člen | 306
+
0
-

kubon napsal(a):

Mám ten samý problém co Oggy, po odeslání formuláře je pole z getValues() prázdné, soubory mám aktuální z svn…

No já jsem na ten problém bohužel nedokázal přijít.. a protože to celkem hořelo neměl jsem možnost s tím trávit tolik času.. tak jsem využil plupload.

Honza Kuchař
Člen | 1662
+
0
-

A tento jQuery plugin nějak obchází ty bugy ve flashi? Tzn. funguje session při uploadu?

Oggy
Člen | 306
+
0
-

Honza Kuchař napsal(a):

A tento jQuery plugin nějak obchází ty bugy ve flashi? Tzn. funguje session při uploadu?

to si nejsem jist .. jak to vyzkouším?:) ale funguje to tak jak si představuju.

Editoval Oggy (17. 5. 2010 16:49)

Honza Kuchař
Člen | 1662
+
0
-

Zeptám se jinak, jak jsi to implementoval do projektu? MFU totiž odstraňuje bug, že po uploadu se ti uživatel odhlásí. Totiž pošlou se při uploadu cookies z IE, i když jsi v Chrome.

Oggy
Člen | 306
+
0
-

Klidně ti pošlu kód do mailu..
No mám komponentu dědící od Controlu.. kterou vyrenderuju do ručně vykreslovaného formuláře. Zatím jsem to používal jen ve Firefoxu a uživatel se mi neodhlašuje.

Honza Kuchař
Člen | 1662
+
0
-

Tak fajn, pošli mi to na mail, třeba se to bude hodit v dalším vývoji MFU. Mail najdeš zde: http://www.mujserver.net/?…

Ondřej Kubíček
Člen | 494
+
0
-

Oggy napsal(a):

kubon napsal(a):

Mám ten samý problém co Oggy, po odeslání formuláře je pole z getValues() prázdné, soubory mám aktuální z svn…

No já jsem na ten problém bohužel nedokázal přijít.. a protože to celkem hořelo neměl jsem možnost s tím trávit tolik času.. tak jsem využil plupload.

joo plupload se mi líbí hlavně kvuli html5 a uploadu přetažením přímo ze složky, ale trošku mam problem jak ten upload.php z examplu přetvořit do presenteru :-)

Oggy
Člen | 306
+
0
-

kubon napsal(a):

Oggy napsal(a):

kubon napsal(a):

Mám ten samý problém co Oggy, po odeslání formuláře je pole z getValues() prázdné, soubory mám aktuální z svn…

No já jsem na ten problém bohužel nedokázal přijít.. a protože to celkem hořelo neměl jsem možnost s tím trávit tolik času.. tak jsem využil plupload.

joo plupload se mi líbí hlavně kvuli html5 a uploadu přetažením přímo ze složky, ale trošku mam problem jak ten upload.php z examplu přetvořit do presenteru :-)

já si udělal componentu ..

tady js kód pluploadu:

<?php
$("#flash_uploader").pluploadQueue({
		// General settings
		runtimes : 'flash',
		url : {link upload},
		max_file_size : '10mb',
		chunk_size : '1mb',
		unique_names : true,
                rename: true,
                multi_selection:false,

                browse_button : 'pickfiles',
	        container : 'container',

		filters : [
			{ title : "Flash files", extensions : "flv,FLV"},
		],

		// Resize images on clientside if we can
		resize : { width : 1200, height : 900, quality : 90},

		// Flash settings
		flash_swf_url : '{!$baseUri}swf/plupload.flash.swf'
	});
?>

a componenta Plupload ..a její metoda handleUpload, která nahrazuje právě ten upload.php

<?php
 public function handleUpload() {
        // HTTP headers for no cache etc
	header('Content-type: text/plain; charset=UTF-8');
	header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
	header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
	header("Cache-Control: no-store, no-cache, must-revalidate");
	header("Cache-Control: post-check=0, pre-check=0", false);
	header("Pragma: no-cache");

        // Settings
	$targetDir =  Environment::getVariable('appDir')."/temp/plupload";
	$cleanupTargetDir = false; // Remove old files
	$maxFileAge = 60 * 60; // Temp file age in seconds

        // 5 minutes execution time
	@set_time_limit(5 * 60);
	// usleep(5000);

        // Get parameters
	$chunk = isset($_REQUEST["chunk"]) ? $_REQUEST["chunk"] : 0;
	$chunks = isset($_REQUEST["chunks"]) ? $_REQUEST["chunks"] : 0;
	$fileName = isset($_REQUEST["name"]) ? $_REQUEST["name"] : '';

        // Clean the fileName for security reasons
	$fileName = preg_replace('/[^\w\._]+/', '', $fileName);

        // Create target dir
	if (!file_exists($targetDir))
		@mkdir($targetDir);

        // Remove old temp files
	if (is_dir($targetDir) && ($dir = opendir($targetDir))) {
		while (($file = readdir($dir)) !== false) {
			$filePath = $targetDir . DIRECTORY_SEPARATOR . $file;

			// Remove temp files if they are older than the max age
			if (preg_match('/\\.tmp$/', $file) && (filemtime($filePath) < time() - $maxFileAge))
				@unlink($filePath);
		}

		closedir($dir);
	} else
		die('{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "Failed to open temp directory."}, "id" : "id"}');

	// Look for the content type header
	if (isset($_SERVER["HTTP_CONTENT_TYPE"]))
		$contentType = $_SERVER["HTTP_CONTENT_TYPE"];

	if (isset($_SERVER["CONTENT_TYPE"]))
		$contentType = $_SERVER["CONTENT_TYPE"];

	if (strpos($contentType, "multipart") !== false) {
		if (isset($_FILES['file']['tmp_name']) && is_uploaded_file($_FILES['file']['tmp_name'])) {
			// Open temp file
			$out = fopen($targetDir . DIRECTORY_SEPARATOR . $fileName, $chunk == 0 ? "wb" : "ab");
			if ($out) {
				// Read binary input stream and append it to temp file
				$in = fopen($_FILES['file']['tmp_name'], "rb");

				if ($in) {
					while ($buff = fread($in, 4096))
						fwrite($out, $buff);
				} else
					die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}');

				fclose($out);
				unlink($_FILES['file']['tmp_name']);
			} else
				die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}');
		} else
			die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}');
	} else {
		// Open temp file
		$out = fopen($targetDir . DIRECTORY_SEPARATOR . $fileName, $chunk == 0 ? "wb" : "ab");
		if ($out) {
			// Read binary input stream and append it to temp file
			$in = fopen("php://input", "rb");

			if ($in) {
				while ($buff = fread($in, 4096))
					fwrite($out, $buff);
			} else
				die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}');

			fclose($out);
		} else
			die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}');
	}

	// Return JSON-RPC response
	die('{"jsonrpc" : "2.0", "result" : null, "id" : "id"}');

    }
?>
Honza Kuchař
Člen | 1662
+
0
-

Tak to bude implementace jednoducha. Staci prepsat GUI a metodu handleUpload – nebo tak nejak se jmenuje.

Oggy
Člen | 306
+
0
-

Honza Kuchař napsal(a):

Tak to bude implementace jednoducha. Staci prepsat GUI a metodu handleUpload – nebo tak nejak se jmenuje.

jj..řešil jsem to cestou nejmenšího odporu a funguje to spolehlivě .. pokud to budeš schopen přepsat na componentu dědící od FileUploadu aby to bylo možné použít ve formuláři..

zatím to do formuláře dostávám vlastně až v templatu.

Honza Kuchař
Člen | 1662
+
0
-

Oggy napsal(a):

Honza Kuchař napsal(a):

Tak to bude implementace jednoducha. Staci prepsat GUI a metodu handleUpload – nebo tak nejak se jmenuje.

jj..řešil jsem to cestou nejmenšího odporu a funguje to spolehlivě .. pokud to budeš schopen přepsat na componentu dědící od FileUploadu aby to bylo možné použít ve formuláři..

zatím to do formuláře dostávám vlastně až v templatu.

Já: Staci prepsat GUI a metodu handleUpload – nebo tak nejak se jmenuje.

To je metoda v MFU :-)

dotTwelve
Člen | 167
+
0
-

Nechcete nekdo popsat implementaci plupload do Nette? MFU mi prijde hodne tezkopadne->zastarale…Diky

Honza Kuchař
Člen | 1662
+
0
-

Bude to jen jednoduchá úprava MFU. Jak říkám, jak si najdu chvíli čas, udělám tu modularitu gui → více možností jako odesílat soubory ze strany klienta.

MFU je těžkopádné právě proto, aby to fungovalo. Věř tomu, že kdyby to nemuselo být takto složité a dlouhé, nedělal bych to tak.

dotTwelve
Člen | 167
+
0
-

Tak nakonec za pomoci Oggy-ho jsem to implementoval (plupload). Jeste jednou diky!

Plná velikost – http://twitpic.com/1wqikz/full

Editoval dotTwelve (14. 6. 2010 15:39)

h4kuna
Backer | 740
+
0
-

ahoj taky bych byl pro nějaký balík kde budou skripty, js, swf jen pro MFU nic víc. Nebo to jde nastavit v svn klientovi?

Honza Kuchař
Člen | 1662
+
0
-

nejde, ale je to fajn nápad. Pokusím se to nějak v rámci té změny systému GUI promítnout.

mcmatak
Člen | 504
+
0
-

SESSION a COOKIES

když používáte upload v nějakém adminu jeste závislí na ověření identity uživatele, přece nemohu jen tak leckomu dovolit nahrávat na server soubory, jenomže ověření a tomu věřím, probíhá vždy na základě session

nicméně flash session neposílá (resp. cookies) :(

pročetl jsem si tady všechny příspěvky, ale jestli se nepletu tak tady odpověď na tohle není, krom přidávání sessionname a sessionid do url? což není nejlepší nápad, alespoň myslím z hlediska bezpečnosti

je na tohle řešení?

když tak o tom přemýšlím, jednorázová možnost nastavení sessionid v url, tedy ne stálé předávání v url, kde může ten odkaz utéct, ale jednorázové zavolání post požadavku s nastaveným sessionid je stejně tak nebezpečné jako současné udržování session v cookies

nebo se mýlím? tedy řešením je předat cookies sessionid do post požadavku swf a v bootstrapu nastavit sessionid pokud přistane přes post toto id, vhodné řešení?

Editoval mcmatak (20. 6. 2010 14:44)

Panda
Člen | 569
+
0
-

Řekl bych, že to je už dávno vyřešeno systémem tokenů – fronta souborů se ukládá pod určitým tokenem, pokud token neexistuje, k nahrání souboru nedojde. Stačí tedy, když autorizaci podléhá vytvoření tokenu (= vytvoření samotné komponenty ve formuláři).

mcmatak
Člen | 504
+
0
-

sory ale nejak nechápu???

jde mi o to ze nahravat na server soubory by mel mit jen uzivatel co na to ma prava, a to ze je prihlaseny prece overuji podle session druha moznost je s kazdym pozadavkem posilat jmeno a heslo ale to je jeste vetsi blbost

Panda
Člen | 569
+
0
-

Probíhá to takto:

Přihlášenému uživateli zobrazíš formulář. Ve formuláři je prvek MultipleFileUpload. Tento prvek si při vytvoření vygeneroval token a uložil si ho do databáze. Pokud uživatel pošle soubory k nahrání, posílá se s nimi současně i vygenerovaný token. Při zpracování nahraných souborů se kontroluje, zda je zaslaný token platný. Pokud ano, zařadí se soubory do fronty k dalšímu zpracování. Pokud ne, nestane se nic. Po odeslání samotného formuláře se fronta vybere a Ty pracuješ se soubory, které byly zařazeny do fronty.

Pokud uživatel nebyl přihlášen, nezobrazil se mu formulář a tím pádem se mu ani nevygeneroval token – při pokusu nahrát soubor se nic nestane.

Už je to jasnější?

Honza Kuchař
Člen | 1662
+
0
-

Je to přesně tak, jak to píše Panda. :-)

pracj3am
Člen | 14
+
0
-

Demo nefunguje v Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.19) Gecko/2010033100 Iceweasel/3.0.6 (Debian-3.0.6–3)
Pouze tlačítko „Odeslat“, které po kliknutí nic nedělá.