Implementace dropzone + upload manager

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

Dobrý večer,
řešil jsem teď implementaci dropzone.js a tak bych se chtěl podělit o můj výtvor a zeptat se zkušených, jestli je to řešeno správně, popř. jak to řešit jinak :-)
předem díky za každou reakci ;-)

HandleUpload z presenteru

	/** @var \ondrs\UploadManager\Upload @inject * */
public $upload;

	public function handleUpload($folder) {
    $fileUpload = new \Nette\Http\FileUpload($_FILES['uploadfile']);
    $this->upload->singleFileToDir($fileUpload, $folder);
}

Vytvoření komponenty v BasePresenteru

	protected function createComponentDropzoneUpload() {
    $dropzone = new \App\Components\DropzoneUploadControl;
    return $dropzone;
}

DropzoneUploadControl.php

class DropzoneUploadControl extends \Nette\Application\UI\Control{
    public function render($folder = NULL) {
        $template = $this->template;
        $template->setFile(__DIR__ . '/../presenters/templates/components/dropzoneUploadControl.latte');
        $template->folder = ($folder) ? '&folder=' . $folder : NULL;
        $template->render();
    }
}

DropzoneUploadControl.latte

<div class="panel panel-default">
    <div class="panel-heading"><strong>Upload souborů</strong></div>
    <div class="panel-body">
        <!-- Drop Zone -->
        <div class="upload-drop-zone">
            <form action="{$baseUri}/?do=upload{$this->folder}" class="dropzone"></form>
        </div>
    </div>
</div>

Vykreslení komponenty v šabloně

{control dropzoneUpload, 'folder'}
akadlec
Člen | 1326
+
0
-

proč skládáš tu url takto na „prasáka“ přímo v šabloně?

wassy
Člen | 46
+
0
-

no, prvotní myšlenka byla mít to všechno z jednoho místa a mít jeden handler v homepage presenteru, ale je pravda že by ten handler mohl být na více místech a stačil by {plink}

potapnik
Člen | 127
+
0
-

Využil bych spíš klasický Nette form a v jeho zpracování zpracoval i ten upload. Bude to výrazně čistější :-) a obejdeš se o volání _FILES, prostě jenom zavoláš upload na addFileUploadu a o ostatní se postará Dropzone :-)

potapnik
Člen | 127
+
0
-

Nějak takto:

<?php

function createComponentDropZone() {
	$form = new UI\Form;
	$form->getElementPrototype()->class = 'dropzone';
	$form->addUpload(...);
	$form->onSuccess[] = array($this, 'uploadFile');
}

function uploadFile($form, $values) {
	$upload = $values->uploadItem;
	$upload->move(...);
}

?>

Ostatni zpracuje Dropzone.

wassy
Člen | 46
+
0
-

a jak to potom bude fungovat s ajaxem?

potapnik
Člen | 127
+
0
-

Obalis tu {control} do snippetu.

wassy
Člen | 46
+
0
-

Nějak se mi to nedaří zprovoznit, myslím že se do té metody UploadFile() nedostanou žádné data…

function createComponentDropZone() {
        $form = new Nette\Application\UI\Form();
        $form->getElementPrototype()->class = 'dropzone';
        $form->onSuccess[] = array($this, 'uploadFile');
        return $form;
    }

    function uploadFile($form, $values) {
        $fileUpload = $values->uploadfile;
        $this->upload->singleFileToDir($fileUpload, 'pokus');
    }
potapnik
Člen | 127
+
-1
-

Nepoužívej this->upload ale přímo $fileUpload->move();

https://api.nette.org/…oad.php.html#…

wassy
Člen | 46
+
0
-

To je UploadManager https://componette.org/search/?… , ten bych chtěl ponechat…

David Matějka
Moderator | 6445
+
0
-

@wassy nevytvaris u formu upload input.

wassy
Člen | 46
+
0
-

To sice ne, ale pokud to dobře chápu, tak to si ošetří dropzone.js , krom toho sem to zkoušel i s inputem a žádná změna :)

Matey
Člen | 142
+
0
-

Dnes som sa snažil o niečo podobné a toto je funkčné.

Presenter:

<?php
/**
 * @return Form
 */
protected function createComponentForm()
{
	$form = new \Nette\Application\UI\Form();
	$form->getElementPrototype()->class = 'dropzone';
	$form->onSuccess[] = [$this, 'processForm'];
	return $form;
}

/**
 * @param Form $form
 */
public function processForm(Form $form)
{
	$file = $form->getHttpData($form::DATA_FILE, 'file');
	\Tracy\Debugger::fireLog($file);
	// spracovanie obrazku .. napr u mňa uloženie do db:
	$image = new \App\Model\Image();
	$image->image = \Nette\Utils\Image::fromFile($file);
	$image->name = $file->name;
	$image->namespace = 'upload';
	$this->orm->images->persistAndFlush($image);
}
?>

Latte:

{control form}

Má niekto ešte nejakú lepšiu možnosť?

hoou
Člen | 43
+
0
-

@Matey Skusil som si vytvorit cisty nette projekt, do toho som dal len ten dropzone a skusil som ten tvoj kod, ale do processForm sa mi ziadne data nedostanu. $file je NULL a ked som sa pozrel, co obsahuje $form, tak nic zaujimave som tam nenasiel. Taktiez $values neobsahovalo nic. Akurat som do createComponentForm pridal addSubmit, ale inac som pouzil cisto tvoj kod. Robim nieco zle?

EDIT: Okej nemal som jquery. Uz to tam mam. Teraz dostavam takyto error v konzole: Error: Dropzone already attached. BTW stale mi do processForm nic nepride.

EDIT2: Okej mal som tam jeden .js subor navyse. Nechal som tam len dropzone.min.js uz to nehlasi ziadnu chybu, bohuzial stale to akosi nefunguje. Ziadne data sa mi do processForm nedostanu.

Editoval hoou (17. 1. 2016 17:49)

Oli
Člen | 1215
+
0
-

Nevím jestli ti tam náhodou ještě nechybí input. Já to mám takhle: https://github.com/…Uploader.php#…. Můžeš vyzkoušet celej doplněk, jeslti bude k užitku budu rád :-)

hoou
Člen | 43
+
0
-

Skusal som to nainstalovat cez composer, ale nepodarilo sa. Mam nette 2.3

Warning: This development build of composer is over 60 days old. It is recommended to update it by running „C:\ProgramData\ComposerSetup\bin\composer.phar self-update“ to get the latest version.
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

Problem 1
 – nette/nette v2.3.5 requires nette/application 2.3.5 → no matching package found.
 – nette/nette v2.3.4 requires nette/application 2.3.4 → no matching package found.
 – nette/nette v2.3.3 requires nette/application 2.3.3 → no matching package found.
 – nette/nette v2.3.2 requires nette/application 2.3.3 → no matching package found.
 – nette/nette v2.3.1 requires nette/application 2.3.2 → no matching package found.
 – nette/nette v2.3.0 requires nette/application 2.3.1 → no matching package found.
 – nette/nette v2.2.9 requires nette/application 2.2.6 → no matching package found.
 – nette/nette v2.2.8 requires latte/latte 2.2.5 → no matching package found.
 – nette/nette v2.2.7 requires nette/application 2.2.4 → no matching package found.
 – nette/nette v2.2.6 requires nette/application 2.2.3 → no matching package found.
 – nette/nette v2.2.5 requires nette/application 2.2.3 → no matching package found.
 – nette/nette v2.2.4 requires nette/application 2.2.3 → no matching package found.
 – nette/nette v2.2.3 requires nette/application 2.2.2 → no matching package found.
 – nette/nette v2.2.2 requires nette/application 2.2.1 → no matching package found.
 – nette/nette v2.2.12 requires nette/application 2.2.9 → no matching package found.
 – nette/nette v2.2.11 requires nette/application 2.2.8 → no matching package found.
 – nette/nette v2.2.10 requires nette/application 2.2.7 → no matching package found.
 – nette/nette v2.2.1 requires nette/application 2.2.0 → no matching package found.
 – nette/nette v2.2.0 requires nette/application 2.2.0 → no matching package found.
 – nette/nette v2.3.8 requires nette/caching 2.3.4 → satisfiable by nette/caching[v2.3.4].
 – Conclusion: don't install nette/caching v2.3.4
 – Installation request for olicek/dropzone-uploader dev-master → satisfiable by olicek/dropzone-uploader[dev-master].
 – Conclusion: remove nette/application v2.3.8
 – Installation request for nette/caching == 2.4.3.0 → satisfiable by nette/caching[v2.4.3].
 – Conclusion: don't install nette/application v2.3.8
 – olicek/dropzone-uploader dev-master requires nette/nette >2.1.0 → satisfiable by nette/nette[v2.1.10, v2.1.11, v2.1.12, v2.1.9, v2.1.1, v2.1.2, v2.1.3, v2.1.4, v2.1.5, v2.1.6, v2.1.7, v2.1.8, v2.2.0, v2.2.1, v2.2.10, v2.2.11, v2.2.12, v2.2.2, v2.2.3, v2.2.4, v2.2.5, v2.2.6, v2.2.7, v2.2.8, v2.2.9, v2.3.0, v2.3.1, v2.3.2, v2.3.3, v2.3.4, v2.3.5, v2.3.6, v2.3.7, v2.3.8].
 – nette/nette v2.3.6 requires nette/application 2.3.6 → satisfiable by nette/application[v2.3.6].
 – nette/nette v2.3.7 requires nette/application 2.3.7 → satisfiable by nette/application[v2.3.7].
 – Can only install one of: nette/application[v2.3.6, v2.3.8].
 – Can only install one of: nette/application[v2.3.7, v2.3.8].
 – nette/nette v2.1.1 conflicts with nette/application[v2.3.8].
 – nette/nette v2.1.10 conflicts with nette/application[v2.3.8].
 – nette/nette v2.1.11 conflicts with nette/application[v2.3.8].
 – nette/nette v2.1.12 conflicts with nette/application[v2.3.8].
 – nette/nette v2.1.2 conflicts with nette/application[v2.3.8].
 – nette/nette v2.1.3 conflicts with nette/application[v2.3.8].
 – nette/nette v2.1.4 conflicts with nette/application[v2.3.8].
 – nette/nette v2.1.5 conflicts with nette/application[v2.3.8].
 – nette/nette v2.1.6 conflicts with nette/application[v2.3.8].
 – nette/nette v2.1.7 conflicts with nette/application[v2.3.8].
 – nette/nette v2.1.8 conflicts with nette/application[v2.3.8].
 – nette/nette v2.1.9 conflicts with nette/application[v2.3.8].
 – Installation request for nette/application == 2.3.8.0 → satisfiable by nette/application[v2.3.8].

Potential causes
A typo in the package name
The package is not available in a stable-enough version according to your minimum-stability setting

see <https://groups.google.com/…c/discussion> for more details.

Read <https://getcomposer.org/…eshooting.md> for further common problems.

Installation failed, reverting ./composer.json to its original content.

hoou
Člen | 43
+
0
-

@blaztar dakujem, uz to nainstalovalo

@Oli Prepac za debilne otazky, ale vobec sa v tom nevyznam. Co je galleryEntity? Zhrniem moje snazenie. Do cisteho Nette som nainstaloval tvoj doplnok. Cez config som to zaregistroval. Stiahol som dropzoneUploader.js a vlozil do sablony. Do HomepagePresenteru som hodil tento kus kodu:

private $factory;

public function __construct(DropzoneUploaderFactory $factory)
{
	parent::__construct();

	$this->factory = $factory;
}

public function createComponentUploader($name)
{
	$factory = $this->factory;
	$dropzone = $factory->create();
	$path = $dropzone->getPath();
	$dropzone->onSuccess[] = function (DropzoneUploader $dropzoneUploader, $targetPath, $name, $suffix) {
		Debugger::dump($name);
		Debugger::dump($suffix);
		die();
		/*$photo = new Photo;
		$photo->filename = $name . '.' . $suffix;
		$photo->suffix = $suffix;
		$this->photosRepository->save($photo);*/
	};
	return $dropzone->setPath($path . '/' . $this->galleryEntity->folder . '/1600x1200');
}

Nic ine som nerobil. Hadze mi to chybu, ze nepozna galleryEntity. Co teraz? Treba este niekde nieco nastavovat? Co ma predstavovat $this->galleryEntity->folder a co vlastne robi ta metoda setPath()? Uplne sa v tom stracam.

Oli
Člen | 1215
+
0
-

No funguje to tak, že to uloží fotku na disk a vrátí ten onSuccess. Ten onSuccess je tam proto, že informace o tý fotce budeš chtít asi uložit do databáze. Vůbec nemusíš používat ten path. Ten setPath slouží k tomu, že když si vytvoříš databázi, tak budeš chtít aby fotky v té konkrétní databázi byli v jedné složce a z jiné databáze zase v jiné. No a abys věděl kam to uložit, tak si to musíš vytáhnout odněkud. Zde to je databáze, která je reprezentovaná objektem $this->galleryEntity a má sloupeček folder.

Každopádně pokud to necháš jen takhle (a nechceš speciální cestu), tak by ti to mělo nahrát na server a vypsat ten dump.

public function createComponentUploader($name)
{
    $factory = $this->factory;
    $dropzone = $factory->create();
    $dropzone->onSuccess[] = function (DropzoneUploader $dropzoneUploader, $targetPath, $name, $suffix) {
        Debugger::dump($name);
        Debugger::dump($suffix);
        die();
        /*$photo = new Photo;
        $photo->filename = $name . '.' . $suffix;
        $photo->suffix = $suffix;
        $this->photosRepository->save($photo);*/
    };
    return $dropzone;
}
hoou
Člen | 43
+
0
-

No tak uz tam vidim tu dropzone. Kde je ale nejaky submit? Alebo ako to odoslem na server? Potrebujem tuto komponentu dat do nejakeho formulara? Ak ano, tak prosim ako?

Moj problem je nasledovny. Mam produkty. Kazdy produkt moze mat niekolko obrazkov. Chcem aby to vsetko bolo ulozene napr v www/products/<id>/, s tym ze <id> sa bude menit podla id produktu. Kazdy produkt teda bude mat svoju zlozku, v ktorej bude mat ulozene tie svoje obrazky. A vsetky tie zlozky budu v zlozke www/products. Potom ale pri spracovani chcem aj tie jednotlive cesty ulozit do databazy. S tym by som si uz ale poradil, ak by som sa dostal do onSuccess a mal tam vsetky informacie, ktore potrebujem. Ako sa tam ale dostanem? Ked do dropzone nahadzem obrazky, ako to odoslat na server?

Oli
Člen | 1215
+
0
-

Pokud se nepletu, tak by to mělo nahrávat automaticky když tam přetáhneš/vybereš obrázek. Tohle už by mělo být funkční. Browser konzoli máš bez erroru? Nette ti žádný error nehází?

Někam pod dropzone.js musíš zavolat funkci dropzoneUploader() z dropzoneUploader.js.

hoou
Člen | 43
+
0
-

Zacina sa to pomaly rysovat. Ano mas pravdu. Subory to hned nahralo na server. Ale nevypisalo ziaden dump. Pouzil som teda tu funkciu dropzoneUploader() a vsimol som si, ze na queuecomplete, sa vola /dropzone/www/?do=uploader-refresh. Ale preco tento signal? Nemam ho nikde definovany. Inak tak ako som to mal definovane hore, to stale pouzivam, teda chcem dumpnut tie premenne a skoncit. Toto sa nedeje, ale po pridani toho .js sa automaticky po nahrati hocilen jedneho obrazka stranka presmeruje na /dropzone/www/?do=uploader-refresh, co nechapem ako moze fungovat, ked ziadny taky signal nemam definovany v HomepagePresenteri. Vyzera to tak, ze subor sa nahraje, ale nevidim vobec ze ako to skoncilo, hned sa to akoby refreshne a uz tam nevidim tie nahrane obrazky. Pozrel som znova na github a tam mas dole nejaky priklad nastavenia. Hovorim si, ze skusim zapnut ajax. Hodil som to do configu takto:

extensions:
map: Oli\Form\DropzoneUploaderExtension

dropzone:
settings:
ajax: on

Dostavam ale takuto chybu:

Found section ‚dropzone‘ in configuration, but corresponding extension is missing.

Co chcem je, aby sa v pripade uspechu obrazky nahrali, popritom aby sa ulozilo nieco do db ohladom tych obrazkov. A ked nastane chyba, tak niekde ju vypisat a to by bolo dobre, ak by to islo vsetko cez ajax. Zeby som potom aj videl, ake som obrazky nahral a aby ma to hned nepresmerovalo niekde inde. Ale mozno to tak funguje, len mne tam zase nieco chyba. Dakujem za trpezlivost so mnou.

Oli
Člen | 1215
+
0
-

Moje chyba. Mám to v tom readme špatně, tam nemá být map, ale třeba dropzone. Ono ve výsledku to je jedno jak si to pojmenuješ, ale jméno extension musí sedět k tomu nastavení (už jsem to opravil).

Zatím to mám tak, že se to přesměruje vždy. Možná bych to mohl poupravit. Pokud chceš přesmětovat jakoby zpátky, tak uprav tenhle řádek na 'onSuccess' => 'this'.

A už vím proč se ti ten dump nevypíše, protože se to přesměruje. Dej si pod ten dump exit() a bez ajaxu. To by mělo fungovat. Pokud budeš chtít ajax, tak zase vrať onSuccess na refresh! a ajax na TRUE a mělo by to být zajaxováno.

hoou
Člen | 43
+
0
-

Ale ved tam mam die(), to by malo stacit nie? Zmenil som to ale teda na exit() a deje sa to iste. Presmeruje to a nevidim ziadny dump. Kde je definovany ten handleRefresh? Jak to, ze to nevyhodi ziadnu chybu, ze to nepozna, ked v HomepagePresenteri to nemam definovane. A preco ked je v nastaveni refresh!, tak na konci url je ?do=uploader-refresh namiesto ?do=refresh a ako to je vobec spojene s tym, co mam definovane tu:

	$dropzone->onSuccess[] = function (DropzoneUploader $dropzoneUploader, $targetPath, $name, $suffix) {
    Debugger::dump($name);
    Debugger::dump($suffix);
    die();
    /*$photo = new Photo;
    $photo->filename = $name . '.' . $suffix;
    $photo->suffix = $suffix;
    $this->photosRepository->save($photo);*/
};

Do tejto anonymnej funkcie sa podla mna ani nedostane. Inak uz aj ked mam zapnuty ajax, tak hned po nahrani obrazku, ten obrazok zmizne (takze robi to to iste, co bez ajaxu, akurat nerefreshuje celu stranku – chybal mi nette.ajax.js). Ale stale mi vrta hlavou, preco sa to presmerovava na /dropzone/www/?do=uploader-refresh, a kde to je vobec definovane.

Oli
Člen | 1215
+
0
-

Ten refresh je součástí doplňku: https://github.com/…Uploader.php#L208. A proto tam je taky uploader před tím refresh.

Je divný že ti to nezavolá tu událost. Zkus si dát exit sem: https://github.com/…Uploader.php#L119. Pokud se to tam dostane tak si to odkrokuj kam až se to dostane a kde to skončí. Fungovat by to takhle mělo

hoou
Člen | 43
+
0
-

Ani tam sa nedostane. Ja uz fakt neviem co s tym je.

Oli
Člen | 1215
+
0
-

Muzes to nahrat nekam na github? Kouknul bych se na to, proc ti to nejde…

Oli
Člen | 1215
+
0
-

Tak je to funkční, jen mě nedošlo, že ta funkce při přidání fotky se volá ajaxem, takže dump a exit ti nepomůže. Maximálně ti to mohlo vyhodit 500 v js konzoli…

Dej si místo dump a exit: Debugger::log($name); a pak v log/info.log uvidíš jméno a příponu uploadovanýho souboru…

hoou
Člen | 43
+
0
-

Aha. Ale ved aj ked som vypol ajax, tak to nikdy nepadlo na tom die(). Zvlastne. Tak ked budem mat cas, skusim sa s tym dalej pohrat a nejako to vyuzit pre svoje potreby. Este by som sa chcel spytat, ci je mozne nejako zakazat to zmiznutie obrazkov hned po uploade. Alebo si to mam spravit tak, ze pod tu komponentu budem vykreslovat vsetky obrazky a potom to ajaxom prekreslovat stale?

Oli
Člen | 1215
+
0
-

Protoze ten ajax je az na to zaverecny presmerovani. Ale po každým odeslaným souboru se spustí process a ten se spouští ajaxem.

hoou
Člen | 43
+
0
-

Jaaaj. A kde mam odchytavat tie vynimky, co sa vyhadzuju v process()?

Oli
Člen | 1215
+
0
-

No, to nemusíš myslím. Pokud to spadne, tak se ta výjimka zobrazí přímo u náhledu. Teď mě napadá, že možná se to refresne i když to spadne, což by bylo špatně. Na to se podívám až budu mít čas.

Správně se to má chovat tak, že se to refreshne pokud je vše v pohodě a nahraje se celá fronta. Pokud alespoň jeden soubor vyhodí výjimku tak se to nemá refresnout a má se zobrazit u fotky křížek s chybou.

hoou
Člen | 43
+
0
-

No mazes to stale po uploadnuti, pozri sem

Ale to som si zakomentoval. Ja nechcem, aby to zmizlo. Inak preco vyhadzujes vynimky napr tuto ?

Neni nejaky lepsi sposob, ako preniest tu chybu do sablony? Ked sa pozeram na sietovu aktivitu, vidim proste http code 500 – to je ta vynimka. To by mi mozno az tak nevadilo, ale potom v dive s triedou dz-error-message, vidim celu tu chybu ako html kod, namiesto normalnej textovej spravy. Ked mam vypnuty debugMode, vyzera to takto a ked mam zapnuty tak takto.

Oli
Člen | 1215
+
0
-

Díky! Tohle by určitě chtělo vyřešit. To mazání uploadovanejch upravit jak jsem psal výše. Mě to naposledy vypisovalo normální lidskou chybu. Ale je možný, že jsem to něčím dál rozbil. Budu se na to zase muset podívat :-) Kdyžtak můžeš poslat nějaký PR s opravama, když se ti bude chtít. Rozhodně to, že náhledy zůstanou pokud je alespoň jedna chyba. To by měla být záležitost jen js souboru.

hoou
Člen | 43
+
0
-

Tu som sa docital, ze by si mal tie chyby posielat ako text/plain alebo application/json. Tie vynimky posielaju text/html. Skusil som tuto vetvu nahradit tymto kodom:

		if($this->isImage && $file->isImage() !== $this->isImage)
		{
			/** @var Response $httpResponse */
			$httpResponse = $this->container->getByType('Nette\Http\Response');
			$error_msg = 'Soubor musí být obrázek';
			$httpResponse->setContentType('text/plain');
			$httpResponse->setHeader('Content-Length', strlen($error_msg));
			$httpResponse->setCode(Response::S500_INTERNAL_SERVER_ERROR);
			$this->presenter->sendResponse(new TextResponse($error_msg));
			return;
		}

Vtedy to uz vypise normalne len ten text kratky jednoduchy. Vyzera to tak, ze to funguje. Lenze nepaci sa mi ten kod. 7 riadkov je asi vela. Este ked to ma byt rozkopirovane do dalsich 3 vetiev. Mozno ti napadne, ako to napisat efektivnejsie.

A skusim sa teda este pozriet na ten javascript.

hoou
Člen | 43
+
0
-

A preco to vlastne chces nechat hned zmiznut po uploade? Ja som si to teraz upravil tak, ze po uploadnuti mi to tam ostane. Navyse som si pridal remove linky a prepojil to s Nette. Takze ked kliknes pod obrazok na remove link, tak odstrani ho zo stranky, ale aj zo servera ten subor. Funguje mi to aj ked uploadnes viac rovnakych suborov a potom to cislujes postupne od 1 hore. Tak stale vymaze ten spravny, pretoze si potom v javascripte ulozim ten novy upraveny nazov.

Oli
Člen | 1215
+
0
-

No protože vycházím z toho, že když tam něco uploaduju, tak vím co a hned po uploadu nechci obrázek mazat. Navíc si to ukládám do databáze a pod uploaderem mám grido, který obsahuje obrázky z galerie. Takže při ajaxu by mě tam ten obrázek zůstal 2×.

Hlavní ale je, že nevidím moc smysl v tom, že po uploadu hned můžu smazat co jsem nahrál. Myslíš že to někdo využije?

hoou
Člen | 43
+
0
-

Zalezi od uzivatela. Niekto tam nahodi 10 fotiek. Potom si to este prezrie ci nieco nezabudol, ci nahodou nieco nepridal omylom, tak to pripadne zmaze. Neviem, pride mi to normalne. Este rozmyslam, ze napriklad v mojom pripade (tie produkty) by som chcel po case mozno zmenit fotky, pridat, zmazat. To by sa dalo vyriesit cez init, pocas ktoreho si vyziadam zo servera existujuce fotky v danom priecinku a ten mi ich posle, potom ich znazornim aj na stranke. Takze pridem na dany produkt, ktory uz existuje a ma 5 fotiek a hned sa mi do dropzone nacitaju. Potom ich mozem jednoducho mazat, pripadne pridat dalsie. Ale tak v tvojom pripade asi je lepsie, ked to hned zmizne, kedze mas ten grid a prekreslujes si to nizsie. Ja by som ale chcel vyuzit pre tieto potreby tu komponentu, kedze grid som zatial ani neskusal a mam to riesene inak.

Oli
Člen | 1215
+
0
-

Ze chce nahrát další, to bych chápal, ale mazání mě už smysl nedává. Ještě by mě dávalo smysl, kdyby to obsahovalo nějakej editor, on to tam nahrál zkusil upravit a pak si řekl, to je hnusný ať dělám co dělám a smazal to. To jo, ale jen nahrát a pak smazat to se mi moc nelíbí. Navíc ten grid to umí smazat taky…

Každopádně já bych to chtěl nechat jako low level knihovnu pro nahrávání souborů. Prostě to jen vezme soubor, uloží kam mu řeknu a vrátí mě jméno souboru a ostatní zpracování nechá na mě. To je přesně to co potřebuju. Ostatní uploudovací doplňky jsou větší molochy. Buď se starají i o vykreslení nebo mají definovaný jak má databáze vypadat. To si chci všechno definovat sám…

Každopádně, pokud se to bude týkat tohodle use case, tak budu moc rád za jakejkoliv PR nebo i jen issue na githubu. :-)

btw. Pokud bys chtěl stavět na téhle knihovně a potřeboval/pomohlo by ti tam mít možnost smazat tu fotku a aby to nepřesměrovalo po nahrání, tak když na to přidáš přepínač do configu, tak klidně pošli PR, tomu se nebráním. :-)

hoou
Člen | 43
+
0
-

Uvidim ako mi to pojde, kazdopadne ti velmi pekne dakujem za pomoc :)