WordPress - Velké dny malého osla
PrestaShop – An Error Occurred While Uploading Image
Nahrání obrázku do PrestaShop
Tak už to na světě chodí, člověk objeví něco nového, je z toho celý nadšený, najednou BUM, PRÁSK a je tu problém. Zhruba takovýto vývoj měla moje první zkušenost s novým francouzským open source e-shopem Prestashop. Přesto jsem se nevzdala a ponořila svoji mysl do čtení všech možných fór a diskuzí, které mi mohly problém osvětlit. Většinou jsem však narážela pouze na zoufalé volání těch, kteří se topili ve stejném bahně. Když se nějaké řešení objevilo, nebylo pro mě řešením, ale usilovným šplháním z útrob propasti, po kterém následoval opětovný pád na tvrdou zem.
Abych vás všechny uvedla do konkrétního problému jednalo se o následující věc. Poté, co jsem úspěšně prošla instalací celého softwareového balíku a vše se jevilo jako že super, narazila jsem na tvrdý odpor. Moje následující kroky směřovaly do BackOffice – Tools – Languages, kde jsem chtěla přidat češtinu, ale ouvej. Přestože jsem postupovala přesně podle návodu na fóru, tj. do pole Jméno jazyka vložila: Čeština (Czech), do pole ISO vyťukla: cs, moje snaha ztroskotala na nahrávání obrázků. Poté, co jsem hrdě klikla na save a čekala, až mi s požadovaným id=3 naskočí čeština, naskočila zrada v podobě následujícího výkřiku do tmy:
“An error occurred while copying no-picture image to your product folder. An error occurred while copying no-picture image to your category folder. An error occurred while copying no-picture image to your manufacturer folder.”
Ze zoufalství jsem se rozhodla zkusit přidat obrázek do katalogu produktů, ale výsledek nebyl nikterak potěšující. Ba naopak. Hláška typu: “An error occurred while uploading image” mě nenechala na pochybách, že je tu něco sakra špatně. Ale co, to teda babo raď.
Po několika denním pátrání se zdálo, že stopy směřují na můj hosting a poté, co jsem technickou podporu požádala o zapnutí directivy “display_errors” bylo patrné, kde že přesně je ten zakopaný pes. Hostuji u Českého hostingu na nejichž stránkách může pozorný čtenář nebo otravný uživatel narazit na následující řádky:
“Po nahrání PHP souboru pomocí metody POST je soubor uložen do systémového dočasného adresáře. Z důvodu restrikce přístupu odsud nelze nahraný soubor jednoduše získat, nebo s ním jinak pracovat. Proto je nutné použít PHP funkci move_uploaded_file(), která soubor přesune z dočasného adresáře do nového umístění v prostoru Vaší domény, kde se již se souborem dá pracovat.”[1]
Chybová hláška, která se po zapnutí directivy “display_errors” objevila, s tímto korespondovala: Waring: file_exist() [function.file-exists]: open_basedir restriction in effect. File (/home/www/tmp/phpjQQnfx) is not within the allowed path(s): (/home/www/domena.cz/www/domena.cz) in /home/www/domena.cz/www/domena.cz/e-shop/images.inc.php on line 117.
Řešení je jednoduché, ale pro člověka, který je v prenatálním programátorském období docela oříšek. Na tomto místě se sluší a patří poděkovat mému kamarádovi Jirkovi, který mi ho pomohl rozlousknout. Postup je následující:
V adresáři, do kterého jste nakopírovali celý obsah Prestashopu, vytvořte nový podadresář “Temp” a nastavte mu “chmod na 750″. Bude to přímo na úrovni Vaší domény, nebo v adresáři doména.cz/prestashop, či jakkolik jste si ho pojmenovali. Jen pro kontrolu, že si rozumíme bude tento podadresář ve stejné úrovni, jako “uploads”, “translations”, “tools”, “themes”, “mails”, “config”, “admin”, atd.
Nyní je třeba udělat druhý, trošku složitější krok. V adresáři “config” se nachází soubor “config.inc.php”, do kterého je nutné doplnit níže uvedenou funkci. Soubor proto stáhněte do počítače, otevřte v nějakém textovém či HTML editoru a pod funkci…
if (function_exists(’date_default_timezone_set’))
date_default_timezone_set(’Europe/Paris’);
…vložte následující řádky:
/* Safemode hack for file upload. */
if (isset($_FILES))
{
foreach ($_FILES AS $key => $value)
{
$random=rand();
$tempname="/home/www/domena.cz/www/domena.cz/e-shop/temp/".$value["name"].$random;
move_uploaded_file($value["tmp_name"], $tempname);
$_FILES[$key]["tmp_name"]=$tempname;
}
}
Nezapomeňte upravit cestu k adresáři “temp” dle názvu své domény a složek, kterými procházíte!!! Název “domena.cz”je zde použit pouze orientačně a za lomítkem může být např. adresář “prestashop” – v mém případě “e-shop” nebo rovnou “temp”. Záleží na tom, jak to máte nastavené a pojmenované. Tato funkce přesune všechny uploadnuté soubory do vytvořeného “temp” adresáře a přepíše původní proměnné tak, aby ukazovaly na tenhle soubor.
Jediné, co je na závěr potřeba zajistit, je průběžné promazávání složky “temp”. Když se připojím na server Českého hostingu, vidím předtím, než rozkliknu svůj doménový adresář i následující složky: “usr”, “pristupy”, “lib”, “etc”, “dev”, “data”, “CRON.tyden”, “CRON.mesic”, “CRON.den” a “CRON.2hodiny”. Ve složce “CRON.2hodiny” vytvořte nový soubor s názvem: “clear_temp_folder.php” a do něj vložte následující script:
<?php
if ($handle = opendir('/home/www/domena.cz/www/domena.cz/e-shop/temp')) {
/* This is the correct way to loop over the directory. */
while (false !== ($file = readdir($handle))) {
unlink($file);
}
closedir($handle);
}
?>
Předtím, než přepíšete původní soubor, nezapomeňte přejmenovat adresář “domena.cz” a napsat správnou cestu za lomítkem. Jelikož mi nefunguje nahrávání obrázků ani ve WordPressu, tak se omlouvám za strohý text bez ukázek. Jen co to rozchodím, tak to tady vymaluju. Závěrem snad jen přeju hodně štěstí a pokud naleznete v mém návodu nějaké nesrovnalosti, nebo krkolomná vysvětlení či se chcete jakkoliv jinak vyjádřit, neváhejte zanechat komentář.
Použité zdroje
- Český hosting, Skripty na serveru – PHP skripty [online]. [cit. 2009-02-21]. Dostupné z: http://www.cesky-hosting.cz/napoveda-detail-php-skripty.html
Ijáček napsal(a):
Speciálně pro RADKA – patrně budeš první, kdo se dle mého návodu bude pokoušet postupovat, takže mi prosím písni všechno to, co Ti nebylo úplně jasné a kde se objevil nějaký zádrhel, abych to případně doladila pro ostatní do stavu “EasyPeasy”.
Karel napsal(a):
Dneska jsem si spolu psali na fóru prestashopu…. Já používám také wordpress na rodinných stránkách, co se týká uploadu obrázků, je to otázka nastavení práv do složky “uploads”. Na Českém hostingu stačí 757 na složky…
Ijáček napsal(a):
Ahojda, já tam ta práva mám nastavena dokonce na 777, ale chybka bude asi někde jinde, páč jsem si všimla, že mi to ten obrázek nahraje, ale ne do složky “uploads”, nýbrž na stejnou úroveň, tj. jakoby vedle ní. Pokud ho jednoduše přetáhnu dovnitř, tak je vše OK. Jen jsem ještě nezjistila, kde to opravit.
Ijáček napsal(a):
Uz jsem to nasla. Neslo o nic jineho, nez v administraci jit do Settings – Miscellaneous Settings a tam nastavit “Store uploads in this folder” ve tvaru “wp-content/uploads”. Nevím, jak se to stalo, ale měla jsem tam jen “wp-content” a to byl důvod, proč se to strkalo vedle.
Karel napsal(a):
Dal jsem ten mazací skript do složky cron.2hodiny ale nemaže… cestu v něm mám uvedenu takhle:
/home/www/bambuscentrum.cz/www/obchod.bambuscentrum.cz/temp
což by mělo být správně…
Ijáček napsal(a):
Uvozovky uz jsem zmenila. Vlozila jsem to tam pro jistotu znovu cely ze zalohy. Kdybych tam pri editaci prve udelala nejakou chybku. Snad to ted pofrci.
Ijáček napsal(a):
Tak ještě jedna poznámka k mazacímu skriptu. Na počátku se nezobrazilo: <?php
Už jsem to tam doplnila, tak si to zkopíruj znovu a mělo by to být OK. Všimla jsem si toho až teď. Je ale dost pravděpodobné, že jsi to z logiky věci doplnil hned sám.
PrestaShop – instalace-Velké dny malého osla napsal(a):
[...] je ještě ve hvězdách, zda se při prvních krůčcích v adminovi nesetkáte s hláškou: An Error Occurred While Uploading Image, což by znamenalo, že Vám nepůjdou nahrávat obrázky. Ale zatím v [...]
Ijáček napsal(a):
Horst said: Ijáčku, jsi zlato…! Díky, díky…
Já děkuji za FeedBack – těší mě, že to funguje
BoUk napsal(a):
Ahoj, nedávno jsem též objevil Prestashop a začal jsem ho prozkoumávat. Na lokálu jelo všechno jako víno, ale když jsem shop přesunul na Český hosting, narazil jsem na popisovaný problém s uploadem obrázků. Po chvilce googlení jsem narazil na tuto stránku, která mi pomohla problém okamžitě vyřešit. Takže, díky moc.
Tomas napsal(a):
Ahoj, neviem ci nieco robim zle, ale u mna tento postup nefunguje. Respektive, kym ho neaplikujem, tak sa mi ukazuje chybova hlaska, ze nemoze uploadovat obrazok do jedneho adresara. Akonahle uplatnim tento postup, tak sa zacnu zobrazovat vsetky tri, ako je popisane hore. Ma niekto nejaky napad?
( v podstate neprebehne ani ta pridana funcia, pretoze v temp foldri sa nic nenachadza). Dik za kazdy debugging
jirka napsal(a):
díky, díky, díky. Tohle jsem řešil týden ale nějak mi to nefungovalo. Přesně článek pro mě. A funguje
hatori napsal(a):
Nemohl jsem také nahrávat obrázky na PS a díky tomuto skvělému návodu mi to už funguje. Všechny palce vzhůru a vivat ijáčkovi
Díky!
Miloš Němec napsal(a):
Dobrý den, popisované řešení není úplně správné. Problém je v testování existence odeslaných příloh přes konstrukci isset($_FILES). Superglobální proměnná $_FILES ale bude nastavena při odeslání každého formuláře, který obsahuje input typ=file, bez ohledu na to, jestli byl soubor skutečně odeslán. Takže pokud ponecháte položku přílohy ve formuláři prázdnou, budete se pak pokoušet přesouvat neexistující soubor a jeho vygenerovaný název navíc zapíšete pod klíč tmp_name. Tím si pravděpodobně zaděláte na řadu budoucí problémy. isset($_FILES) bych tedy nahradil třeba za toto:
$isUplodadedFile = false;
foreach ($_FILES as $key => $value) {
if ($value['error']==0) // UPLOAD_ERR_OK
$isUplodadedFile = true;
}
if ($isUplodadedFile) …
webplus napsal(a):
Po úpravě mi na ČS funguje nahrávání obrázků, češtiny, atd., ale při změně údajů v produktu a pokusu o uložení bez opětovného vyplnění cesty k obrázku dostanu chybu “image format not recognized”. Máte někdo stejný problém?
webplus napsal(a):
webplus napsal(a): Po úpravě mi na ČS funguje nahrávání obrázků, češtiny, atd., ale při změně údajů v produktu a pokusu o uložení …
Pomohla úprava p.Miloše Němce
$isUplodadedFile = false;
foreach ($_FILES as $key => $value) {
if ($value['error']==0) // UPLOAD_ERR_OK
$isUplodadedFile = true;
}
if ($isUplodadedFile)
{
$random=rand();
$tempname="/home/www/domena.cz/www/domena.cz/e-shop/temp/".$value["name"].$random;
move_uploaded_file($value['tmp_name'], $tempname);
$_FILES[$key]['tmp_name']=$tempname;
}
samozřejmě s odpovídající cestou (názvem domény)
Díky!
Miloš Němec napsal(a):
Popisovaný způsob mazání není správný a nemůže fungovat. Funkce unlink očekává cestu k souboru vzhledem k pracovnímu adresáři skriptu, tedy rootu domény, nikoli jen jeho název. Takže funkční mazání je například takto:
$path = 'domena.cz/shop/temp';
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
unlink($path."/".$file);
}
}
closedir($handle);
}
- Copyright 2010 WordPress – Velké dny malého osla.Projekt je validní CSS 2.1 a XHTML 1.0 Strict
- Zpět na úvod stránky
- Domů





Váš komentář-