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

  1. Český hosting, Skripty na serveru – PHP skripty [online]. [cit. 2009-02-21]. Dostupné z: http://www.cesky-hosting.cz/napoveda-detail-php-skripty.html

Relevantní odkazy-

Zdroje-

Polls-

Nejoblíbenější postava ze seriálu The BigBang Theory

Zobraz výsledky hlasování

Loading ... Loading ...
Ijáček - Gravatar

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”.

Publikováno dne: 21. 2. 2009 v(e) 13:46Reakce na tento komentář
Karel - Gravatar

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…

Publikováno dne: 22. 2. 2009 v(e) 16:40Reakce na tento komentář
Ijáček - Gravatar

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.

Publikováno dne: 22. 2. 2009 v(e) 16:49Reakce na tento komentář
Ijáček - Gravatar

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.

Publikováno dne: 23. 2. 2009 v(e) 0:47Reakce na tento komentář
Karel - Gravatar

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ě…

Publikováno dne: 23. 2. 2009 v(e) 20:28Reakce na tento komentář
Ijáček - Gravatar

Ijáček napsal(a):

Zkus dat tu cestu do jednoduchych rovnych uvozovek.

Publikováno dne: 23. 2. 2009 v(e) 21:31Reakce na tento komentář
Ijáček - Gravatar

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.

Publikováno dne: 23. 2. 2009 v(e) 21:41Reakce na tento komentář
Ijáček - Gravatar

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.

Publikováno dne: 24. 2. 2009 v(e) 20:53Reakce na tento komentář
PrestaShop – instalace-Velké dny malého osla - Gravatar

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 [...]

Publikováno dne: 9. 3. 2009 v(e) 1:02Reakce na tento komentář
Horst - Gravatar

Horst napsal(a):

Ijáčku, jsi zlato…! Díky, díky…

Publikováno dne: 9. 3. 2009 v(e) 1:38Reakce na tento komentář
Ijáček - Gravatar

Ijáček napsal(a):

Horst said: Ijáčku, jsi zlato…! Díky, díky…

Já děkuji za FeedBack – těší mě, že to funguje :)

Publikováno dne: 9. 3. 2009 v(e) 1:47Reakce na tento komentář
BoUk - Gravatar

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.

Publikováno dne: 26. 3. 2009 v(e) 15:14Reakce na tento komentář
Ijáček - Gravatar

Ijáček napsal(a):

No tak to jsou samé dobré zpávy :)

Publikováno dne: 26. 3. 2009 v(e) 15:37Reakce na tento komentář
Tomas - Gravatar

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 :)

Publikováno dne: 14. 5. 2009 v(e) 10:56Reakce na tento komentář
jirka - Gravatar

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 :-)

Publikováno dne: 29. 5. 2009 v(e) 22:07Reakce na tento komentář
hatori - Gravatar

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!

Publikováno dne: 4. 6. 2009 v(e) 13:02Reakce na tento komentář
Miloš Němec - Gravatar

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) …

Publikováno dne: 18. 6. 2009 v(e) 13:31Reakce na tento komentář
webplus - Gravatar

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?

Publikováno dne: 18. 6. 2009 v(e) 15:36Reakce na tento komentář
webplus - Gravatar

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!

Publikováno dne: 18. 6. 2009 v(e) 22:41Reakce na tento komentář
Miloš Němec - Gravatar

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);
}

Publikováno dne: 21. 6. 2009 v(e) 12:51Reakce na tento komentář


Váš komentář-

Průvodce: Při psaní komentáře můžete používat základní HTML značky. Netematické a nevhodné komentáře budou upraveny nebo vymazány. Emailová adresa nebude za žádných okolností publikována.

XHTML: Můžete použít následující tagy: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

Všechna pole označená"*" jsou povinná.