Ekezetes fajlok letoltese php-vel

 ( parocgab | 2011. szeptember 8., csütörtök - 11:41 )

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 "";
$cella=1;
while (! is_bool($fajl = readdir($kvt) ) )
{
if ( ! is_dir("$konyvtar/$fajl") ) # megnezem, hogy a beolvaasott fajl nem konyvtar-e
{
if ( $cella >=4 ) # max 4 oszlopban lesznek
{
$cella=1;
print "";
}
print "$fajl" # ha nem, kiiratom
."&nbsp";
$cella=$cella+1;
}

}
print "";
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ás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

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.