Zmazanie uploadnuteho suboru, pri nepouziti move()
- matto
- Člen | 55
Zdravim,
momentalne riesim tento problem:
uzivatel uploadne obrazok, ten resiznem na tri rozne velkosti a nasledne ulozim
do troch roznych zloziek.
`<?php $thumbs = $photo->getImage();
$detail = $photo->getImage();
$full = $photo->getImage();
$fullpath = WWW_DIR . „/photos/full/“ . $fileName;
$thumbspath = WWW_DIR . „/photos/thumbs/“ . $fileName;
$detailpath = WWW_DIR . „/photos/detail/“ . $fileName;
$full->resize(800, 600);
$full->save($fullpath);
$thumbs->resize(95, 60);
$thumbs->save($thumbspath);
$detail->resize(334, 215);
$detail->save($detailpath);?>`
Moja otazka znie: je potrebne sa suboru v $photos nejak zbavit?
A este jedna otazka: je mozne to spravit nejak efektivnejsie?
- Ola
- Člen | 385
Asi bych to přepsal takhle:
<?php
$sizes = array(
'thumb' => array(95, 60),
'detail' => array(334, 215),
'full' => array(800, 600),
);
foreach($sizes as $subdir => $size) {
$photo->getImage()
->resize($size[0], $size[1])
->save(WWW_DIR . "/photos/{$subdir}/{$fileName}");
}
?>
První otázku jsem nepochopil.
Editoval Ola (20. 7. 2010 22:02)
- Vyki
- Člen | 388
matto napsal(a):
A este jedna otazka: je mozne to spravit nejak efektivnejsie?
Efektivní je udělat to načítání náhledů „líně“ jako je to ukázáno např. zde: https://forum.nette.org/…vani-nahledu.
- matto
- Člen | 55
Otazka 1: pravdepodobne som sa spytal somarinu. Nakolko presne neviem ako to cele funguje, mal som pocit, ze ten subor ostane niekde v temp, pokial ho funkciou move() nepresuniem.
Ola: Dakujem, tvoje riesenie som hned implementoval, je kus elegantnejsie ako to moje :)
Vyki: Diky! vypada to vynikajuco a myslim, ze pri 8mich obrazkoch, ktore sa vo finalnej verzii budu naraz pridavat cez administraciu to podstatne zrychli spracovanie. Avsak momentalne si to nechavam na buduci refraktoring, nakolko ma palia ine veci. Kazdopadne to tam casom implementjem.
- westrem
- Člen | 398
matto napsal(a):
Otazka 1: pravdepodobne som sa spytal somarinu. Nakolko presne neviem ako to cele funguje, mal som pocit, ze ten subor ostane niekde v temp, pokial ho funkciou move() nepresuniem.
Nespytal si sa blbost. Pri uploade suborov su tieto vzdy uploadovane do temp adresara (nastavuje sa direktivou upload_tmp_dir, vid PHP manual sekcia File Uploads).
Pocas spracovania skriptu je subor k dispozicii (pokial ho explicitne neodstranis pocas behu). Po ukonceni behu skriptu sa subor maze sam.
- westrem
- Člen | 398
Ola napsal(a):
Asi bych to přepsal takhle:
<?php $sizes = array( 'thumb' => array(95, 60), 'detail' => array(334, 215), 'full' => array(800, 600), ); foreach($sizes as $subdir => $size) { $photo->getImage() ->resize($size[0], $size[1]) ->save(WWW_DIR . "/photos/{$subdir}/{$fileName}"); } ?>
První otázku jsem nepochopil.
Myslienka dobra, ale schvalne, nahliadnutie do API
reference pre 0.9.5 Nette bez prefixu
Resize v Nette\Image funguje tak, ze vytvori blank image a donho kopiruje.
V tvojom postupe, ak spravne chapem kompletnej logike a prevedeniu kodu nastava
ten jav, ze sa obrazok resizne na najmensi rozmer, a potom sa v dalsich krokoch
resizuje na vecsi (z mensieho) atd ..
Preto navrhujem klonovat obrazok vo foreach nasledovne:
<?php
foreach($sizes as $subdir => $size) {
$workphoto = clone $photo;
$workphoto->getImage()->resize($size[0], $size[1])
->save(WWW_DIR . "/photos/{$subdir}/{$fileName}");
}
?>
Pripadne prehodit poradie resizovanie od vecsieho k mensiemu.
EDIT: No stacilo sa v API povrtat hlbsie David to urobil spekulantsky a kazde zavolanie getImage() vrati vzdy novy objekt, takze povodne riesnie je OK.
Editoval westrem (21. 7. 2010 1:17)