[addon multiplefileupload] MultipleFileUpload – form control
- Honza Kuchař
- Člen | 1662
Tak zkus zkus krokovat (debugovat), použij na to třeba XDebug, ten je zdarma a instalace je primitivní. Jako IDE používám Netbeans.
Případně lepší debuger má Nusphere PHPEd. Ale ten je placený.
- Honza Kuchař
- Člen | 1662
Tzn. že ta třída není definována. Před tím, než se ten kousek kódu vypíše, musí být načten soubor s tou třídou. Tedy stále ti nefunguje {!=MultipleFileUpload::getHead()}. Rozchoď ten debuger a myslím, že to budeš mít opravené za chvilku.
- Honza Kuchař
- Člen | 1662
Poměrně jednoduše. Hlavní pravidlo zní, zkoušej to metodou pokus a omyl. Začal bych tím, že bych si umístil break point ve fci ::getHead(). A krokoval bych do všech možných úrovní, až bych zjistil, proč mi ta fce navrací kus HTML a prázdný string/null/false… Důležité je, pronikat postupně do hlubších a hlubších úrovní na těch místech, kde se nám něco nezdá.
- kashpi
- Člen | 48
Doufám, že se nikdo nelekne co jsem s tím provedl, ale bylo to původně pro osobní účely, až potom mě napadlo to dát sem, jelikož by to uvítalo více lidí.
- kashpi
- Člen | 48
Narazil jsem na problém, jak mám nahrát víc souborů?
Myslím jako, nahrávám spoustu fotek přes to, dejme tomu, že sem tam dal
50 fotek cca 2MB každá. Fotky se odešlou, odešle se formulář a při
zpracování se uloží jedna fotka jako v normálním rozlišení a k ní se
vytvoří náhled a potom se do databáze přidá záznam. Ale vždycky mi to po
30sekundách co to běží spadne.
Stihne se uložit jen cca 16 fotek, nevíte čím to je?
- kucix
- Člen | 33
Napadají mě dvě možnosti ..
- nahrávat po jednom (nebo jiném vhodném počtu) ;)
- Nahrát a nezpracovávat, jen je uložit a vytvořit mezistránku, kde budou jen obrázky ve smyslu <img src=„/upload/zpracuj/obrazek-5“ …>
K druhé možnosti – v metodě toho presenteru, která se bude volat si
nastavíš odesílaný mime type na image/gif (třeba) a najdeš správný
obrázek, zpracuješ si ho a v případě úspěchu odešleš obrázek „OK“
nebo fajfku … a v případě neúspěchu nějaký takový ten červený
kříž, stopku … atp …
Na té mezistránce budeš mít třeba 100 takových obrázků a jak si je
prohlížeč bude chtít stáhnmout, tak vytvoří request na ten presenter a
metodu, což zpracuje ten konkrétní obrázek … zpracovává se jich pak
třeba i víc najednou, záleží na více faktorech různých nastavení
prohlížeče, serveru atd …
- Honza Kuchař
- Člen | 1662
Upřímně řečeno, řešil jsem to s MFU také. Při testovací implementaci se mi při uplodu velkého počtu malých souborů ztrácely některé náhodné soubory. Pak jsem zjistil, že ten upload běží vlastně paralelně a nikoli seriově, jak jsem si myslel → je třeba mít modely THREAD-safe, jinak se ti budou ztrácet soubory.
Napiš mi prosím, co ti vrátí getValue() na MFU po odeslání formuláře?
MFU jsem testoval na:
- 4GB souboru
- 500× malé soubory
- mix
Všechno dobré – Winx64 Apache 2 PHP 5.3.2
Pokud si myslíš, že nastala výjimka při uploadu souboru, zapni si produkční režim, kdy se chyby logují do souborů.
PS: Na localhostu se mi přes upravenou verzi MFU nepodařilo nahrát nic. :-( JavaScriptvá stránka věci se chová nějak podivně, ty jsi tam něco měnil?
(oprava v SVN)
Tvoje verzi jsem přidal ke stažení na stránku s MFU, případné updaty prosím mailuj/fóruj, rád to updatuji.
- lvq
- Člen | 47
@**kashpi**: Pred par mesici jsem resil to samy. Nakonec jsem to udelal tak, ze ihned po nahrani se fotka zpracuje, pak se nahraje dalsi a zase se ihned zpracuje. Musel jsem teda zlehka upravit MFU, ale ve vysledku to jelo tak, jak jsem chtel. (Sice je tam nevyhoda, ze se na chvilku zastavi ten ukazatel uploadu, ale je to jen chvilika a to jsem delal 2 nebo 3 nahledy a jeste jsem z fotky tahal EXIF a IPTC a zpracovaval.)
- kashpi
- Člen | 48
Měnil jsem tam pár věcí i v JS. Protože, to nějak ignorovalo v těch
souborech v těch interfacích hodnoty %baseUri%, tak jsem je přepsal na
{$baseUrl}.
To ale není u pluploadu, v něm sem neměnil nic, tam to jelo. Zkusím na to
kouknout a kdyžtak zjistit chyby co jsem spáchal :D
Jinak co se týká odesílání souborů tak dump mi vrátí všechno v pohodě
Nette\ArrayHash(1) {
upload => array(37) [
0 => Nette\Http\FileUpload(5) {
name private => "P1010027.JPG" (12)
type private => NULL
size private => 2368673
tmpName private => "W:\www\foto-eva\app/../temp\uploads-MFU\8c09e3a01125a7cae39b45d7e22c4f6384888c80" (80)
error private => 0
}
1 => Nette\Http\FileUpload(5) {
name private => "P1010028.JPG" (12)
type private => NULL
size private => 2371303
tmpName private => "W:\www\foto-eva\app/../temp\uploads-MFU\c3ba07f3ce34b4184a1700dc88ee1085b7318d28" (80)
error private => 0
}
...
36 => Nette\Http\FileUpload(5) {
name private => "P1010070.JPG" (12)
type private => NULL
size private => 2190853
tmpName private => "W:\www\foto-eva\app/../temp\uploads-MFU\7dca7ffec4b5d9b72d9e3d9d48e74671393f5abf" (80)
error private => 0
}
]
}
Jinak ta chyba s tím odesíláním co píšeš mi dělá v Chromu, ve FF to jede v pohodě, je to divný, asi sem tam udělal několik chyb při tom přepisu
- kashpi
- Člen | 48
lvq napsal(a):
@**kashpi**: Pred par mesici jsem resil to samy. Nakonec jsem to udelal tak, ze ihned po nahrani se fotka zpracuje, pak se nahraje dalsi a zase se ihned zpracuje. Musel jsem teda zlehka upravit MFU, ale ve vysledku to jelo tak, jak jsem chtel. (Sice je tam nevyhoda, ze se na chvilku zastavi ten ukazatel uploadu, ale je to jen chvilika a to jsem delal 2 nebo 3 nahledy a jeste jsem z fotky tahal EXIF a IPTC a zpracovaval.)
to mě taky napadlo to tak udělat, už jsem to dělal dřív s flashovýma uploaderama. Ale právě jsem chtěl vědět, jestli se to dá dělat i jinak. Každopádně díky za vnuknutí novýho nápadu s EXIFem, aspoň nemusím fotky co jsou na výšku otáčet ručně :)
- Honza Kuchař
- Člen | 1662
MultipleFileUpload tak jak funguje funguje záměrně. Je to kvůli konzistenci, aby se nahrálo buť vše co uživatel vybral nebo aby to skončilo chybou. Takto může velmi jednoduše aplikace skončit v jakémsi „mezistavu“, kdy po ní zůstane nepořádek, který se velmi špatně čistí. S tím vím MFU počítá a řeší to. Nepořádek by po něm tedy zůstávat neměl.
S tím bugem se omlouvám. Aplikuj na Tvoji verzi MFU poslední commit. (dnešní) A bude chyba opravena. Není to tvoje chyba, ale chyba pluploadu. ;-) Viz http://www.plupload.com/…iewtopic.php?… (Fixed HTML5 to use FileReader.readAsBinaryString() instead of File.getAsBinary() on newer WebKit browsers (like Chrome 9).)
Pokud chcete zmenšovat obrázky, možná bude nejlepší k tomu znásilnit plupload. Ten to udělá už na straně klienta. A jen pokud dojdou obrázky špatně, zmenšit na straně serveru.
Proč nepoužíváte lazy-loading pro ty obrázky. Tedy zmenším na potřebnou velikost až to potřebuji? Mě se tato metoda maximálně osvědčila. (ale je třeba samozřejmě kešovat)
- B4nan
- Člen | 13
Tak jsem si dneska chtěl vyzkoušet Plupload (do teď úspěšně provozuju Swfupload na Nette 2beta pro php 5.2 bez prefixu). Poopravil jsem těch pár nekonzistencí, analogicky jako o Swfuploadu, správně se mi všechno načte, zobrazí se okno Pluploadu, ale má to jeden zádrhel – pokud se jako runtime vybere flash, to swfko, které překrývá výběrové tlačítko, má display: none. Procházel jsem většinu JS zdrojáků, a nikde jsem nic, co by ho mělo skrývat nenašel. A aby toho nebylo málo, když to v refresh metodě manuálně přenastavím, lagne to prohlížeč.
Nesetkal se s tím někdo?
- Honza Kuchař
- Člen | 1662
Já. Ale fakt uz nevim, cim to bylo. Kazdopadne vsechny opravy, ktere jsem znal jsem dal do distribuce.
- Honza Kuchař
- Člen | 1662
Nevím o ní, všechny verze pro Nette 2 o kterých vím, jsou umístěny zde: http://projekty.mujserver.net/…_pro_PHP5.3/
- VladimirHans
- Člen | 12
Ahoj, jde vám stáhnout MultipleFileUpload? Na stránkách doplňku nejde ani demo. Firefox mi hlásí, že se nemůže připojit k serveru mujserver.net.
Vláďa
Editoval VladimirHans (30. 10. 2011 19:43)
- Honza Kuchař
- Člen | 1662
Omlouvám se, server je opravdu nedostupný. Zítra to snad opravím. UPC má zase nějaké problémy. (zatím se však zdá, že je chtějí řešit :-)) Tedy zítra odpoledne by už mělo zase všechno fungovat.
PS: Pokud bych to nějak ukrutně rychle potřeboval, mohu ti poslat to, co tu mám jako working copy.
- VladimirHans
- Člen | 12
Ahoj,
zkoušel jsem uptavit MultipleUploadFiles upravit pro prefixovanou verzi Nette,
ale skončil jsem na chybě Callback ‚TemplateHelpers::loader‘ is not
callable. Registrace helperu vypadá
$template->registerHelperLoader(‚Nette\Templates\TemplateHelpers::loader‘);
Vladimír Hans
- Honza Kuchař
- Člen | 1662
Myslím, že spíše ne. (nevím o nikom) Nicméně pokud to budeš psát, normálně vezmi DibiDriver, kde je celkem jasné, co která metoda dělá (případně napiš na mail, pošlu ti Skype, můžeš konzultovat). A pokud Ti to poté nebude vadit, rád ten driver poté zařadím do distribuce.
- jirkaa
- Člen | 5
Potřebuji poradit.
Nahrávání souborů pomocí HTML4SingleUpload mi funguje správně. Tím
myslím, že soubory se uloží. Když ale použiji Plupload či nějaký jiný,
tak se prvek sice načte, po vybrání souborů se všechny zobrazí
v náhledu, ale po kliknutí na tlačítko „spustit nahrávání“ se nic
nenahraje.
Nesetkali jste se někdo s tím? Použil jsem verzi z 27. 8 2011 od Kashpi pro Nette 2.x pro PHP 5.3 ( http://projekty.mujserver.net/…_pro_PHP5.3/ )
- Kaspis
- Člen | 13
jirkaa napsal(a):
Potřebuji poradit.
Nahrávání souborů pomocí HTML4SingleUpload mi funguje správně. Tím myslím, že soubory se uloží. Když ale použiji Plupload či nějaký jiný, tak se prvek sice načte, po vybrání souborů se všechny zobrazí v náhledu, ale po kliknutí na tlačítko „spustit nahrávání“ se nic nenahraje.Nesetkali jste se někdo s tím? Použil jsem verzi z 27. 8 2011 od Kashpi pro Nette 2.x pro PHP 5.3 ( http://projekty.mujserver.net/…_pro_PHP5.3/ )
S Pluploadem jsem měl také problém, nakonec jsem zjistil, že při použití Pluploadu se mi nenaplní $_REQUEST[„chunk“], díky tomu není splněna podmínka v MFUUIPlupload.php viz (řádky 152 – 161)
<?php
//if (($chunk+1) == $chunks) {
// Hotovo
$file = new Nette\Http\FileUpload(array(
'name' => $fileNameOriginal,
'type' => "",
'size' => filesize($filePath),
'tmp_name' => $filePath,
'error' => UPLOAD_ERR_OK
));
//}
?>
Tak jsem to prasácky zakomentoval a už to jede. Rád bych to však vyřešil správnou cestou, jestli někdo má řešení…
- Honza Kuchař
- Člen | 1662
Ouch, to opravdu bude fungovat jen v pripade, kdy se soubor nahrava jako jedena velka cast. Tedy nedeli se. Chybu, proc se neodesle chunks bych hledal na straně klienta. Nicmene, testoval jsem plupload se vsemi uploadery a vsude mi to fungovalo. (2 mesice zpet…h
- Romca
- Člen | 1
Ahoj,
mám problémek s MFU na nette 2.0 s Plupload.
Postupoval jsem dle návodu, zobrazil se mi pěkně widget od MFU zde přišly
první potíže.
V Firefox 7.0.1 nejde kliknout na Tlačítko Přidat soubory.
Ve Chrome na ně kliknout jde, vybrat soubory jde, ale soubory se pak již
nenahrají.
Zjistil jsem, že Plupload využívá několik technologií pro svůj běh,
zkusil jsem tedy postupně v initJS.js
povypínat runtimes,
"{* runtimes : 'gears,html5,browserplus,flash,silverlight,html4', *}
runtimes : 'html4',"
nakonec jsem skončil u jediné funkčí runtime (ostatní nefungovaly)
html4, které dokonce nahrávají soubory na server ( vidím je
v temp\uploads-MFU\ ).
Po odeslání formuláře je však obsah proměnné
test => array(0)
Samotné volání prvku formuláře mám
$form->addMultipleFileUpload( 'test', 'testovací', 30 );
Netuší někdo, v čem by mohl být problém prosím?
- Honza Kuchař
- Člen | 1662
Bohužel Nette 2.0 není zatím oficiálně podporováno. Verzi pro Nette 0.9.x používáme ve firmě denně na nejnovějších prohlížečích a žádné problémy jsme nezaznamenali. Tedy prosím zkus napsat přímo autorovi verze pro Nette 2.0. ;-)
Podpora pro Nette 2.0 bude pravděpodobně poté, co se ustálí její vývoj, protože poté přenesu svoje projekty na Nette 2.0 a budu migrovat i všechny použité doplňky.
- Honza Kuchař
- Člen | 1662
Nicméně k tvému problému:
- Ta část problému, kdyby nejde kliknout na tlačítko musí být nutně způsobená nečím na straně klienta. Vím, že dělal problém výchozí CSS soubor Nette s Flash runtimem, protože tam má David nastavená nějaký padding a border, což způsobilo, že se Flash vykreslil úplně mimo tlačítko. Jinak se silverlight, flash či html5 políčko vykreslilo na správné místo, bude to pravděpodobně způsobené JavaScriptem, který MFU posílá. Zkus se na to podívat FireBugem.
- To, že se soubor pošle až na server a potom ho nemáš v poli přijatých souborů je pravděpodobně způsobeno tím, že jsi se MFU při zpracování formuláře nepodařilo načíst identifikátor fronty. (každé odesílací políčko pro soubory má svoji frontu – viz modely v MFU)
- Etch
- Člen | 403
Skromný dotaz. Proč je při použití plupload v metodě
MFUUIPlupload::handleUploads()
tato podmínka:
if (($chunk+1) == $chunks) {
// Hotovo
$file = new Nette\Http\FileUpload(array(
'name' => $fileNameOriginal,
'type' => "",
'size' => filesize($filePath),
'tmp_name' => $filePath,
'error' => UPLOAD_ERR_OK
));
}
Pokud je soubor malej, tak je hodnota $chunks == 0, pokud se soubor rozděluje, tak je hodnota $chunks > 0. Pokud se tedy pošle malej soubor, tak vůbec nevznikne proměnná $file. Nebylo by lepší tam dát například podmínku:
if((($chunk+1) == $chunks) OR ($chunks == 0)) {
// Hotovo
$file = new Nette\Http\FileUpload(array(
'name' => $fileNameOriginal,
'type' => "",
'size' => filesize($filePath),
'tmp_name' => $filePath,
'error' => UPLOAD_ERR_OK
));
}
Poté by se to chovalo vždy stejně, a bylo by možno používat jednoduché konstrukce jako například:
if($file instanceof \Nette\Http\FileUpload){
if($file->isImage()){
$file->move($queueModel->getUploadedFilesTemporaryPath().'/test/'.$file->getName());
}else{
unlink($file);
}
}
Nevím třeba to má nějaký důvod, proč tam je zrovna tahle podmínka, ale přijde mi to více než nevhodné, protože se to chová pokaždé jinak.
Editoval Etch (22. 1. 2012 18:16)
- MzK
- Člen | 127
Sice je diskuze neaktivní, ale přesto to zkusím:
Co má vracet metoda getUploadedFilesTemporaryPath() ? Mně
proběhne takto:
<?php
function getUploadedFilesTemporaryPath() {
if (!MFUQueuesDibi::$uploadsTempDir) {
dump(MFUQueuesDibi::$uploadsTempDir); //null
MFUQueuesDibi::$uploadsTempDir = \Nette\Environment::expand("%tempDir%" . DIRECTORY_SEPARATOR . "uploads-MFU");
dump(MFUQueuesDibi::$uploadsTempDir); //"../temp/uploads-MFU"
}
if (!file_exists(MFUQueuesDibi::$uploadsTempDir)) {
@mkdir(MFUQueuesDibi::$uploadsTempDir, 0777, true); //warning mkdir(): Permission denied
}
if (!is_writable(MFUQueuesDibi::$uploadsTempDir)) {
MFUQueuesDibi::$uploadsTempDir = \Nette\Environment::expand("%tempDir%");
dump(MFUQueuesDibi::$uploadsTempDir); // "../temp"
}
if (!is_writable(MFUQueuesDibi::$uploadsTempDir)) {
dump(MFUQueuesDibi::$uploadsTempDir); // "../temp"
throw new \Nette\InvalidStateException("Directory for temp files is not writable!"); //Fatal error: Exception thrown without a stack frame in Unknown on line 0
}
return MFUQueuesDibi::$uploadsTempDir;
}
?>
Fotky se všechny nahrají do temp\uploads-MFU\
, ale pak mi
<?php
$data = $form->getValues();
dump($data);
?>
<?php
Nette\ArrayHash(2)
upload => array(0)
}
?>
Krátce řečeno, soubory se uploadnou do tempu, ale dál už nic :/ napíše to, že se nic neuploadnulo.
- Honza Kuchař
- Člen | 1662
Diskuse není neaktivní, akorát dloho nikdo nic nepotřeboval. :-)
getUploadedFilesTemporaryPath() funguje správně zobrazí-li se soubory v tempu. Při odeslání každého jednotlivého souboru se zakládá záznam v modelu (SQLite, Dibi, …). Pokud nejsou žádné záznamy, nejsou žádné vrácené soubory… Chybu bych hledal někde tam.
Nejjednodušší bude, nestavíš-li si ukládání do MySQL či PostgeSQL, kde můžeš jednoduše sledovat obsah DB pomocí nějakého adminu. Ještě doporučuji zakomentovat obsah metody clenup v MFU. (aby ti to ty záznamy nemazalo)
PS: Z logu nejsou žádné chyby?
- Honza Kuchař
- Člen | 1662
@Etch: Překvapuje mě, že se to chová tak, jak popisuješ. Pokud vím, při přenášení velmi malého souboru vznikne prostě jeden dílek v kterém se to přenese celé. Není to tak? Máš-li kód otestovaný, klidně to zařadím do distribuce… (nám před maturitou, tedy nemám teď čas si s tím hrát)
@taypan: Tuto chybu jsem zaznamenal jen kdysi dávno s Uploadify, ale byla to chyba na klientovi. Havaruje plupload nebo backend? (Hmm, evidentně havaruje plupload: testováno na http://www.plupload.com/…uewidget.php a http://multiplefileupload.projekty.mujserver.net/) Chybu bych hlásil tedy tam. ;-)
- MzK
- Člen | 127
Chyby v logu nejsou.
Do MySQL se soubory uloží, v tempu jsou uploadnuté, ale
$form->getValues() je prázdný!
Dočasně jsem to vyřešil takto:
<?php
public function multipleUploadFormSuccess(Form $form) {
$data = $form->getValues(); //nevim proc, ale prazdne
//tak soubory ziskam takto:
$files = dibi::fetchAll("SELECT id, queueID, created, data, name, chunk, chunks FROM files");
foreach ($files AS $file) {
try {
//zpracovani
dibi::query("DELETE FROM files WHERE name = %s", $file->name); //smazu soubor z databaze
unlink($temp_path.$file->name); //smazu docasny
$this->flashMessage('obrazek '. $i. ' uloadnut');
} catch (Exception $exc) {
$this->flashMessage($file->getName() . ' se nenahralo!', 'error');
}
}
?>
Divná chyba: Fotky se nahrají do tempu i do databáze, ale formulář po
odeslání je prázdný.
Na tu metodu jsem se ptal, protože mi vrací to co mi vrací (viz //
komentáře).
- Honza Kuchař
- Člen | 1662
To co máš napsáno v tom skriptu není nejlepší. Na produkčním serveru ti to fungovat nebude, protože tím smažeš jak soubory, které se teprve odesílají, tak soubory od ostatních uživatelů, které čekají na vyzvednutí.
To je dost divné, zkus se podívat do kódu, jak MFU získává ty data z databáze. Jinými slovy, zkus odkrokovat metodu handleUploads() v MultipleFileUpload.php. (https://svn.mujserver.net:8443/…leUpload.php)
- Lota
- Člen | 38
Existuje už nějaký návod co všechno se musí nastavit, aby MFU začalo fungovat? Nemám problém s rozchozením HTML4SingleUpload, ale jiný interface mi nefunguje, žádná chyba, prostě se nezobrazí ve formuláři, ale prohlížečem to není. Nebo existuje jiný způsob uploadu více souborů najednou?
- Honza Kuchař
- Člen | 1662
Podívej se, co píše Firebug. Máš v šabloně hlavičku MFU? (viz dokumentace)
Moc jsi mi toho neřekl, ani já ti toho moc neřeknu. ;-)
- Kranox
- Člen | 9
Kedy bude aj nejaká oficiálna podpora Nette 2.0 a PHP 5.3? :) Zatiaľ
skúšam tú od Kashpi-ho :/
Ja to snaď nikdy nerozchodím, najprv sa mi nezobrazilo viac menej nič :/
Problém vypnutého JS vo Firefoxe :)
Tak a teraz to zobrazí okná na nahrávanie, ale mená súborov mi do okna
nahodí ako „undefined“.
Ak aj tak stlačím spustiť nahrávanie, tak mi to vo Firebugu vyhodí chyby
file.name is undefined v plupload.html5.js :/
A ako vidím za 6 mesiacov to tu nikto neupravil na Nette\Database :) Asi sa
idem učiť Dibi :) Lebo kým by som to naštudoval a upravil, tak vyjde aj
Nette 3.0 :D
- Honza Kuchař
- Člen | 1662
Já zatím s žádným projektem na Nette 2.0 nepřešel, protože na Nette 0.9 mám vybudovaný takový základ různých rozšíření. Za měsíc maturuji a potom se uvidí…
Dibi se nauč, je to primitivní, za dvě hodiny nemáš co dělat. ;-) Případně můžeš použít SQLite driver, který dibi nepoužívá vůbec. ;-)
Samozřejmě, pokud má někdo tento doplněk upravený pro Nette
2.0 i s driverem na Nette\Database
, nechť ho zveřejní. Pokud
to bude vypadat slušně určitě to rád zařadím do distribuce.