Sziasztok!
Van egy könyvtárstruktúra, amibe felhasználók töltenek fel fájlokat. A fájlok nevei általában tartalmaznak ékezeteket. Ezeket természetesen mások megszeretnének nyitni. Az ékezetek miatt nem találja meg a rendszer. A program részlet, amivel beolvasatnám a fájlokat:
$alkonyvtar=trim(strtok($almenu, '-'));
$konyvtar="../php/Rendelkezesek/emrvpf/$alkonyvtar";
$kvt=opendir($konyvtar) or die ("
Nem sikerült megnyitni a következő könyvtárat:
$konyvtar
");
print "
$fajl |   |
";
closedir($kvt);
A képernyőre jól írja ki a fájl nevét.
Ha rákattintok a linkjére,a hibaüzenet, amit a képernyőre kapok:
Object not found
A hibaüzenet ami az error.log-ban van:
File does not exist: /srv/www/web/php/Rendelkezesek/emrvpf/utasitasok/\xc3\x89kezet_\xc5\x91_\xc5\xb1.txt,
Vagyis, itt már nem tudja megjeleníteni az ékezeteket.
Ha az egeret a link felé viszem, akkor lehet látni, hogy mit szeretne megnyitni. Az jó.
A forrást Geany programmal szerkesztem, ebbe ISO-8859-2 kódolást állítottam be.
Tudtok valami ötletet adni,
Előre is köszönöm:
Gábor
Hozzászólások
Először is használj mindenhol UTF-8-at, sok problémától megszabadulsz.
Ha url-t csinálsz egy fájlnévből, azt előtte enkódolni kell, erre van a php-nak egy urlencode funkciója
Köszönöm. Ez a járható út
Gábor
Lenne még egy kérdésem, ami ehhez a projekthez tartozik:
A letöltendő fájlok között van Office 2010-l készültek is. xlsx, docx stb. Érdekes módon ezeket nem akarja megnyitni, hanem azt mondja, hogy ez egy zip fájl, és ki akarja csomagolni. Ha nem a megnyitást választom, hanem lementem, és utána nyitom meg, akkor tökéletes.
Hogyan tudom megmagyarázni neki, hogy bizony ez nem tömörítvény?
Gábor.
ez nem lokál probléma, több gépről is ez a jelenség?
Bármelyik gépről.
szerkesztve
és csak az xlsx és docx esetén
Ez azert van mert alapvetoleg ezek zip fileok, es emiatt a header Content-type resze x-zip-compressed megy ki. Egyik megoldas: be kell allitani a bongeszodbe, hogy a xlsx, docx eket nyissa megy a xxx program.
biztos van meg kisezer megoldas, keress ra a Content-type xlsx docx zip szavakra.
" biztos van meg kisezer megoldas, keress ra a Content-type xlsx docx zip szavakra."
Megvan a megoldás:
Apache esetén a
mod_mime-defaults.conf
fajlt kell kibővíteni a következőkkel:
AddType application/vnd.openxmlformats-officedocument.wordprocessingml.document (for .docx files)
AddType application/vnd.openxmlformats-officedocument.wordprocessingml.template (for .dotx files)
AddType application/vnd.openxmlformats-officedocument.presentationml.presentation (for .pptx files)
AddType application/vnd.openxmlformats-officedocument.presentationml.slideshow (for .ppsx files)
AddType application/vnd.openxmlformats-officedocument.presentationml.template (for .potx files)
AddType application/vnd.openxmlformats-officedocument.spreadsheetml.sheet (for .xlsx files)
AddType application/vnd.openxmlformats-officedocument.spreadsheetml.template (for .xltx files)
Köszönöm a segítséget
Gábor
> Először is használj mindenhol UTF-8-at, sok problémától megszabadulsz.
Nekem sajnos pont a phpben gyult meg a bajom az utf-8-al. Egy egyszeru strlen nem mukodott rendesen, es a setlocale sem segitett ezen, bar lehet rosszul csinaltam valamit. Viszont tamogatom en is az utf8-at mert pl ha valaki szeretne magyar rovasirassal hasznalni az oldalt, nem kell semmit valtoztatni. Kezdeti szivasok vannak, de hol nem.
nincs unicodeban magyar rovasiras
--
NetBSD - Simplicity is prerequisite for reliability
ez csak egy pelda volt, de ha maradunk a rovasirasnal majd benne lesz:
http://hup.hu/node/26083
http://std.dkuug.dk/JTC1/SC2/WG2/docs/n4110.pdf
Mert azon az mb_internal_encoding() segít és az mb_strlen() kell az strlen() helyett.
Csak egyszer kell megoldani, ha saját keretrendszered van, utána csak használni a funkcióit.
Ha nem követelmény, hogy az url tartalmazza a filenevet, és nincs túl sok file, akkor beolvastathatod a listát egy tömbbe, és az url-be a tömb indexét rakod:
unset($lista);
$d=opendir($konyvtar)
while($fajl=readdir($d)) if(is_file($konyvtar."/".$fajl) lista[]=$fajl;
closedir($d);
...majd később...
if(isset($_REQUEST['download'])&&$lista[$_REQUEST['download']]!='') echo("letoltes ".$lista[$_REQUEST['download']);
foreach($lista as $i=>$name) echo("< a href='tatara/?download=".$i."'>".$name."
");
Ja, és nagyon fontos, hogy !is_dir nem ugyanaz, mint az is_file! Lehet symlink, device file, named fifo stb.