jQuery-FileUpload, snadný upload souborů
- n.u.r.v.
- Člen | 485
Ahoj @JZechy , začínám používat tvůj uploader, ale trochu v tom
plavu… Má to takto:
v neon mám:
extensions:
fileUpload: Zet\FileUpload\FileUploadExtension
fileUpload:
maxFileSize: 10M
uploadModel: Model\UploadFilesRepository
uiMode: full # full nebo minimal
services:
authenticator: Authenticator
...
...
...
- Model\UploadFilesRepository
- App\RouterFactory
router: @App\RouterFactory::createRouter
v App/Model/UploadFilesRepository.php mám:
namespace Model;
use Nette;
use Zet\FileUpload\Model;
class UploadFilesRepository extends Nette\Object implements \Zet\FileUpload\Model\IUploadModel {
public function __construct() {
}
/**
* Zpracování požadavku o smazání souboru.
* @param $uploaded Hodnota navrácená funkcí save.
*/
public function remove($uploaded) {
}
/**
* Zpracování přejmenování souboru.
* @param $upload Hodnota navrácená funkcí save.
* @param $newName Nové jméno souboru.
* @return mixed Vlastní návratová hodnota.
*/
public function rename($upload, $newName) {
}
/**
* Uložení nahraného souboru.
* @param \Nette\Http\FileUpload $file
* @param array $params Pole vlastních hodnot.
* @return mixed Vlastní navrátová hodnota.
*/
public function save(Nette\Http\FileUpload $file, array $params = array()) {
$file->move("../upload_files/". $file->getSanitizedName());
}
}
v presenteru v generování formuláře:
form->addFileUpload("uploader");
Upload mi funguje ale nevím jak rozchodit mazání – při kliku na button pro smazání souboru se odesílá jen nějaké id souboru (1,2,3) a remove() se nezavolá – jak udělat mazání když v metodě save() např. vygeneruji nějaký identifikátor souboru který uložím do DB?
Tedy když např uploaduju 3 soubory, při uložení uložím v save() do DB soubory které dostanou identifikátory xxx,yyy,zzz které potřebuji vrátit a třeba uložit do session a pak jak třeba např. smazat soubor yyy?
Druhý problém je, že se mi někdy stane, že při uploadu více souboru je u některých button pro mazání zašedlý (přitom se soubory nahrály).
díky za nakopnutí
- JZechy
- Člen | 161
@n.u.r.v. Ze save se očekává třeba právě to, že si soubor uložíš do databáze, nebo si navrátíš cokoli, co v metodách rename a remove můžeš použít. Ten return v PHPDoc u save tam není pro srandu :)
Pokud to budeš ukládat do db, stačí si vracet třeba právě ID souboru. S tím už pak nic dál dělat nemusíš, tyhle hodnoty, co tam zapíšeš si totiž uploader zacachuje. Takže do remove a rename dostaneš právě to, co si navrátíš ze save.
Co se týče šedého tlačítka, tak uploader neumožní smazání v těchto případech:
- Upload stále probíhá.
- Přenos na server skončil chybou.
- Nebo nedojde k uploadu, pokud soubor neprojde JS validací (počet souborů, velikost souboru).
- n.u.r.v.
- Člen | 485
díky za odpověď, jdu to vyzkoušet…
Co se týče nedokončeného uploadu, tak např. teď jsem zkoušel nahrát jen doc soubory a z 5 se nahrál jen jeden, 3 ukazovali 100% ale nenahrály se a jeden neměl ani procento.
Jeden se správně nenahrál – měl větší velikost než je nastavená, ale ostatní měli jen pá KB. Díky
Edit: zkusil jsem znova upload bez jakékoliv změny v kodu/konfigurace a soubory se nahrály, tak nevím proč se to děje. Zjistil jsem ale, že když je chci ručně ve win. smazat, tak to chce oprávnění správce…
Edit2: Tak save() i remove() už mi funguje – díky, teď už jen vyřešit tu záhadu proč se občas nenahraje soubor – když je soubor např. moc velký, tak se chyba zobrazí, ale v tomto případě se nezobrazí chyba nikde, soubor ukazuje 100%, button na mazání je zašedlý a ve složce nic není.
Edit3: Aha, tak jsem zjistil, že se soubor nakonec nahraje, ale někdy mu to trvá – progress je na 100%, button je zašedlý a třeba za 15 sekund se button aktivuje a soubor se objeví ve složce
Editoval n.u.r.v. (23. 2. 2017 9:30)
- n.u.r.v.
- Člen | 485
Tak se mi povedlo ukládat do DB i mazat, ale uploaduje se mi jen první
soubor, pak konzole v browseru začne vypisovat Failed to load
resource: net::ERR_CONNECTION_RESET ale je to náhodná chyba a
nezávisí na velikosti souborů
v apache logu je chyba AH00428: Parent: child process 6800 exited with
status 255 – Restarting.
Editoval n.u.r.v. (23. 2. 2017 11:21)
- tkotasek
- Člen | 15
Prvně musím říct, pěkná komponenta!
Včera jsem ji našel a v pohodě rozchodil až na nějaké detaily.
Jen se mi nepodařilo zjistit, zda je možné vypnout možnost
přejmenování souboru po nahrání ve full view.
Případně, lze nastavit co se zobrazuje jako název souboru, abych tam
nezobrazoval příponu souboru?
Díky
- tkotasek
- Člen | 15
JZechy napsal(a):
@tkotasek Vypnutí možnosti přejmenovat k dispozici zatím není, stejně jako zobrazit název bez přípony. Můžeš to ale na GH založit jako issue, případně když si budeš chtít dát tu práci, tak jako PR :)
Zkusím se v tom zorientovat a kdyžtak poslat PR.
Jen jsem si chtěl potvrdit, že neobjevuju kolo, které jenom nevidím.
Dík
- CZechBoY
- Člen | 3608
Čau,
kolik by stálo námahy/času přepsat plugin na podporu php 5.4? Nechci to po
tobě, přepíšu si to sám, jen mě zajímá kolik tam je toho použito z php
5.6 a jestli to ovlivňujou nějaký bugy v php5.4.
Umí plugin filtrovat typ souboru už v upload okně? Tzn. chci umožnit
uživatelovi výběr jen mezi soubory *.txt
.
- CZechBoY
- Člen | 3608
@JZechy ok, těch změn pro 5.4 asi teda nebude moc.
Co říkáš na to filtrování na straně klienta? Podle pluginu by to mělo
být jen otázka nastavení reguláru
https://github.com/…wiki/Options#…
Jinak koukám, že máš assety ve src složce, to by asi nemělo bejt ne? Taky by bylo dobrý vyházet ten bordel od toho pluginu možná.
Mám poslat PR?
- JZechy
- Člen | 161
@CZechBoY
- Na škodu to určitě není, při vytváření filtrace jsem nad tím moc neuvažoval.
- Co se týče WWW, tak jsem neřešil, jestli je to dobře, špatně nebo jestli to má být jinde.
- A věci u pluginu… Přiznám se, že nevím co je navíc a co užitečné… O:-) Takže přebytečné věci se dají v klidu vyházet.
PR pošli kdykoli na cokoli, budu rád :)
- JZechy
- Člen | 161
@jannemec Na JS se musíš podívat na blueimpovo originální upload, jde tam bez problému navazovat jakákoli vlastní JS událost.
- mikethejet
- Člen | 2
Ahoj, Pokud přidávám tento form extension v cyklu
pomocí https://github.com/…msReplicator
Kde měním její „name“. Nedaří se.
Dovolí přidat jen jednu komponentu.
Tj. na stránce (např. taby) lze využít jen jeden fileupload?
$this->addFileUpload(„uploader“);
Nebo je řešení jiné?
Rád bych měl více file uploadů (např. taby atp – v rámci jednoho
formuláře)
Nějaké jednoduché řešení?
- mikethejet
- Člen | 2
Component with name ‚uploadController‘ already exists.
I přes to že do name dávám unikátní.
Tj. pokud přidávám komponentu x krát v cyklu pomocí https://github.com/…msReplicator
je vyzkoušené?
- pitr82
- Člen | 121
JZechy napsal(a):
@pitr82 S chunk uploadem se totiž pracuje dosti odlišně… A to na to není uploader připravený.
JZechy napsal(a):
@pitr82 Připíšu, ale nečekal bych to zase během následujících prvních verzích. Navíc, když jsem viděl ukázkový script jak na to… :D
@JZechy Ahoj,
pokročilo se v tomhle směru někde ?
Editoval pitr82 (20. 6. 2017 13:06)
- dkoleckar
- Člen | 10
Zdravím jsem začátečník s Nette a zkouším rozchodit tuto komponentu.
Bohužel se mi nedaří, zobrazí se mi jiný formulář než je uveden v demu
(https://ctrlv.cz/…/16/6nLx.png), asi zřejmě proto že
používám bootstrap. Ale stejně mi nefunguje ani upload (nezobrazí se
chybové hlášky a samotný upload souboru ani neproběhne). Jakoby ty JS
scripty nefungovaly při tom v šabloně @layout mám vloženo :
{\Zet\FileUpload\FileUploadControl::getHead($basePath)}
{\Zet\FileUpload\FileUploadControl::getScripts($basePath)}
Můj Model upload:
<?php
namespace Model;
use Nette;
use Zet\FileUpload\Model;
class UploadFilesRepository extends Nette\Object implements \Zet\FileUpload\Model\IUploadModel {
public function __construct() {
}
/**
* Zpracování požadavku o smazání souboru.
* @param $uploaded Hodnota navrácená funkcí save.
*/
public function remove($uploaded) {
}
/**
* Zpracování přejmenování souboru.
* @param $upload Hodnota navrácená funkcí save.
* @param $newName Nové jméno souboru.
* @return mixed Vlastní návratová hodnota.
*/
public function rename($upload, $newName) {
}
/**
* Uložení nahraného souboru.
* @param \Nette\Http\FileUpload $file
* @param array $params Pole vlastních hodnot.
* @return mixed Vlastní navrátová hodnota.
*/
public function save(Nette\Http\FileUpload $file, array $params = array()) {
$file->move("../upload_files/". $file->getSanitizedName());
}
}
Můj Config.neon:
parameters:
application:
errorPresenter: Error
mapping:
*: App\*Module\Presenters\*Presenter
session:
expiration: 14 days
extensions:
fileUpload: Zet\FileUpload\FileUploadExtension
fileUpload:
maxFiles: 10
maxFileSize: 2M
fileFilter: Zet\FileUpload\Filter\ImageFilter
uploadModel: App\Model\UploadFilesRepository
uiMode: full
services:
router: App\RouterFactory::createRouter
authenticator: App\Model\Authenticator
- App\Model\Users
Můj presenter + šablona:
<?php
namespace App\Presenters;
use Nette;
use Nette\Application\UI\Form;
class UploadvideoPresenter extends Nette\Application\UI\Presenter
{
protected function createComponentFileUpload()
{
$form = new Form;
$form->addFileUpload("uploader");
return $form;
}
}
{block content}
<div class="container">
<h1>Nahrání videa</h1>
{control fileUpload}
</div>
{/block}
Děkuji za jakoukoliv pomoc.
Editoval dkoleckar (16. 7. 2017 21:30)
- JZechy
- Člen | 161
@dkoleckar Ahoj, co se týče vzhledu, tak ten je bootstrapový, v demu je jenom alternativní vzhled. Jinak ke tvé chybě, v konzoli prohlížeče se něco vypíše?
EDIT: Ještě koukám v configu… Upload máš nazvaný jako video, ale aplikuješ filtr na obrázky, to ti pak nebude procházet ty soubory. Nehledě na to, že možná ani do limitu 2MB se to vejít nebude.
Editoval JZechy (17. 7. 2017 14:59)
- dkoleckar
- Člen | 10
Jo o tom filtru na obrázky vím, zatím ho tam mám jen na zkoušku… V konzoli je spousta erorů https://ctrlv.cz/…/17/wClp.png
- dkoleckar
- Člen | 10
Ano máš pravdu, měl jsem ho špatně vložené… Už vše funguje… Jen se ještě optám, lze nějak udělat to aby se soubor smazal pokud uživatel neklikne na tlačítko odeslat ve formuláři (je to situace kdy uživatel vyplnuje formulář a v jeho průběhu se na server nahraje daný soubor avšak potom si to uživatel rozmyslí a například zavře okno prohlížeče, ovšem soubor zůstane…) ??
A ještě bych se chtěl zeptat, jelikož budu nahrávat video soubory (ty budou mít větší velikost např. 500MB) tak jak uploader zpracuje situaci kdy v průběhu nahrávání se přenos přeruší (například uživatel zavře okno prohlížeče) jde mi o to aby na serveru nezůstával nějaký bordel například v cache…
Lze nějak smazat ten label „uploader“ ??
Díky
Editoval dkoleckar (17. 7. 2017 20:54)
- JZechy
- Člen | 161
@dkoleckar
- Tahle situace je taková krkolomná, nicméně osobně používám metodu, kdy mám u každého souboru status. Když je soubor nahrán, má status 0, když je formulář odeslaný, nastavím na 1. Soubory s 0 jsou pak ty, u kterých uživatel nedokončil zpracování.
- Když uživatel zavře okno, tak má zkrátka smůlu. Takhle to je snad všude.
- Nevypisuj to přes control, ale manuálně přes {form}, {input}, …
- Tomáš Brchaň
- Člen | 13
Ahoj, mám takový dotaz ohledně lokalizace. Docela mě to teď brzdí.
Doplňek se mi líbí, jen ta čeština jě mi tam k ničemu :-(
Navíc nejsem úplně odborník na JS. Ale nedalo by se nějak jednoduše
změnit hlášení třeba přes FileUploadController.messages = [‚Message
1‘, ‚Message 2‘]; ?
Nebo něco jednoduchého do doby, než to bude implementováno trochu obecněji
(nevím, jak to plánuješ, osobně bych preferoval Nette Translator, ať to
mám všude stejné a vůbec nejlépe, kdyby to bylo součástí
FileUploadControl ;-) ).
- iguana007
- Člen | 970
Ahoj, rad by jsem se zeptal, jak si muzu vytvorit vice ruznych definici pro upload. Rekneme, ze v jednom presenteru budu chtit nahravat jen obrazky a v jinem zase jen videa.
EDIT: Jen by jsem rad doplnil, ze mi nejde jen o filtrovani, ale treba i o definici ruznych upload modelu atd. Tj., potrebuji pouzit uploader na vice mistech aplikace, ale vzdy uplne jinak.
EDIT2: Uz to asi mam, podival jsem se do zdrojaku a vypada to, ze vse muzu od hoc nastavovat primo pri definici control ve formulari.
Editoval iguana007 (28. 7. 2017 16:15)
- dkoleckar
- Člen | 10
Zdravím, chtěl bych se zeptat jak docílím toho, aby soubor byl pojmenován stejně jako ID záznamu, který vytvořím odesláním formuláře. Mám tedy formulář s různými poli (název, popis a samotný upload souboru). Po odeslání formuláře (kliknutí na tlačítko odeslat) vytvořím v DB záznam (ID, název, popis) a potřebuji, aby ten nahraný soubor se přejmenoval na to ID.
Díky za radu
- iguana007
- Člen | 970
@dkoleckar vcera jsem addon poprve nasazoval a tipnul bych si, ze by to melo byt nasledovne:
- Nejdrive si soubory ulozis nekam na server s pomoci modelu a metody save, ktery definujes pro zpracovani daneho controlu
- Po odeslani formulare, se ti vola metoda, kterou definujes u onSubmit callbacku u formulare
- V te metode, se ti u $form->getValues vrati seznam souboru, ktere se nahraly, tak uz je muzes dotacne zpracovat/prejmenovat, tak jak potrebujes ;)
- d3tr1tus
- Člen | 52
Ahoj,
mám menší problém s tímto fileuploadem. V mé aplikaci používám 2 moduly – admin a front. Ve front modulu se mi vykreslí naprosto v pořádku, ale v admin modulu to vypadá jakoby se nenačetli css styly a nefunguje javascript. Přitom mám vše zaregistrované naprosto stejné. Mohli by jste mi poradit prosím?
Děkuji
- d3tr1tus
- Člen | 52
@JZechy
Css
<link href="{$basePath}/admin_files/vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<!-- Custom fonts for this template -->
<link href="{$basePath}/admin_files/vendor/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css">
<!-- Plugin CSS -->
<link href="{$basePath}/admin_files/vendor/datatables/dataTables.bootstrap4.css" rel="stylesheet">
<!-- Custom styles for this template -->
<link href="{$basePath}/admin_files/css/sb-admin.css" rel="stylesheet">
<link href="{$basePath}/admin_files/css/admin_core.css" rel="stylesheet">
{\Zet\FileUpload\FileUploadControl::getHead($basePath)}
Js
<!-- Bootstrap core JavaScript -->
<script src="{$basePath}/admin_files/vendor/jquery/jquery.min.js"></script>
<script src="{$basePath}/js/nette.ajax.min.js"></script>
<script src="{$basePath}/js/netteForms.js"></script>
<script src="{$basePath}/js/jquery.ajaxform.js"></script>
<script src="{$basePath}/admin_files/vendor/tether/tether.min.js"></script>
<script src="{$basePath}/admin_files/vendor/bootstrap/js/bootstrap.min.js"></script>
<!-- Plugin JavaScript -->
<!--<script src="{$basePath}/admin_files/vendor/chart.js/Chart.min.js"></script>-->
<script src="{$basePath}/admin_files/vendor/datatables/jquery.dataTables.min.js"></script>
<script src="{$basePath}/admin_files/vendor/datatables/dataTables.bootstrap4.min.js"></script>
<!-- Custom scripts for this template -->
<script src="{$basePath}/admin_files/js/sb-admin.min.js"></script>
{\Zet\FileUpload\FileUploadControl::getScripts($basePath)}
<script src="{$basePath}/admin_files/js/main.js"></script>
Struktura aplikace
App
AdminModule
presenters
HomepagePresenter.php
BasePrestenter.php
template
FrontModule
presenters
HomepagePresenter.php
BasePrestenter.php
template
config
model
prestenter
log
temp
vendor
www
css
less
fileupload
Podle prohlížeče se vše načetlo správně, ale bohužel stále ne…
- d3tr1tus
- Člen | 52
@JZechy
fileUpload:
maxFiles: 10
maxFileSize: 2M
fileFilter: Zet\FileUpload\Filter\ImageFilter
uploadModel: App\Model\UploadModel
uiMode: full # full nebo minimal
extensions:
fileUpload: Zet\FileUpload\FileUploadExtension
Ono to funguje jako nahrávání ale neaplikují se na to CSS styly. A to pouze v Admin prostředí na Frontu je vše v pořádku.
- d3tr1tus
- Člen | 52
@JZechy Právě že nemám. Podle prohlížeče se i fyzicky aplikují styly, ale ve výsledku se to prostě nezobrazí. Příklad: Po nahrání obrázku se obrázek zobrazí v tabulce s názvem a možností smazat. První td s náhledem obrázku by mělo mít width: 90px namísto toho se zobrazí obrázek v plné velikosti a překrývá celou stránku a jde až za okraj. Už mi došly všechny nápady jak to vyřešit opravdu tě nic nenapadá?
- n.u.r.v.
- Člen | 485
Ahoj, chtěl jsem nastavit maximální počet uploadovaných souborů pomocí setMaxFiles(25); Ale nic to nedělá, když jsem se pak podíval do kódu tak opravdu se jen nastaví proměnná a předá do template, ale v samotném template je js zakomentovaný a když to odkomentuju tak to vypisuje několik chyb do konzole (neexistující proměnné apod…)?
Pokud tedy aktuálně není možné nastavit maximální počet souborů, tak by se to mělo z dokumentace odstranit, v opačném případě napsat jak to použít. Díky
p.s.: Hodila by se funkce pro nastavení maximální velikosti všech uploadovaných souborů, aby user mohl třeba uploadovat max. 50MB dat apod..