[addon multiplefileupload] MultipleFileUpload – form control
- despiq
- Člen | 320
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
To prý jde vyřešit. Někde jsem o tom četl. Hledej Uploadify + https nebo Uploadfy+ssl
- Honza Kuchař
- Člen | 1662
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
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
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
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
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)
- Honza Kuchař
- Člen | 1662
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)
- Honza Kuchař
- Člen | 1662
Tak pak bude asi chyba už někde při posílání toho dotazu. Budeš muset debugovat, u mně je to ok.
- Honza Kuchař
- Člen | 1662
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)
- raia
- Člen | 25
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
- Vitek Jezek
- hledá kolegy | 285
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
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
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
A tento jQuery plugin nějak obchází ty bugy ve flashi? Tzn. funguje session při uploadu?
- Honza Kuchař
- Člen | 1662
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.
- Honza Kuchař
- Člen | 1662
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
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
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
Tak to bude implementace jednoducha. Staci prepsat GUI a metodu handleUpload – nebo tak nejak se jmenuje.
- Oggy
- Člen | 306
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
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 :-)
- Honza Kuchař
- Člen | 1662
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
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)
- Honza Kuchař
- Člen | 1662
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
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
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ší?