Gå til innhold

Problemer med URL encoding


Anbefalte innlegg

Sliter litt med å få æøå i filnavn til å fungere på siden min.

Har laget et dokumentarkiv som leser ut filene i en mappe, og linker til disse.

 

Filnavnet kjører jeg gjennom rawurlencode() og ikke urlencode() for å slippe at mellomrom erstattes med plusstegn, men jeg har prøvd begge deler i forhold til æ/ø/å-problemet uten forbedring.

I Firefox 2.0 fungerer dette smertefritt, og den leser %20 (mellomrom) og alle de andre verdiene korrekt. Når filen lastes ned og lagres inneholder den da æ/ø/å. Filen "tøys og tull.doc" lagres som "tøys og tull.doc"

I Opera 9.02 leser den mellomrom korrekt, men de andre verdiene blir stående. "tøys og tull.doc" blir da lagret som "t%F8ys og tull.doc"

I IE6 leser den også mellomrom korrekt, men den stripper de andre verdiene. "tøys og tull.doc" blir da lagret som "tys og tull.doc"

 

Denne siden tror jeg gir en forklaring på hvorfor IE og Opera skiller seg ut fra Firefox (eller omvendt). Tydeligvis er det Firefox som her følger standardene, men det hjelper lite når det går utover brukervennligheten for de andre nettleserne.

 

Ved å bruke mb_detect_encoding finner jeg ut at filene uten æøå gir ASCII, mens de med æøå gir UTF-8. Jeg har ikke satt noen encoding selv via htaccess (Serveren er Apache 2.0.58 / FreeBSD). Men selve html-dokumentet har iso-8859-1 satt som content-type. Har sett litt på og prøvd med utf8_encode(), men har ikke fått noe positivt ut av det.

 

Er det noen som har vært borti dette før, eller vet om en alternativ løsning? Målet er å få lagret filen med det riktige navnet (uten å måtte skrive det selv) i alle tre nettleserne.

Lenke til kommentar
Videoannonse
Annonse

bruker du urldecode også?

Alternativet, om du ikke har det, er å lage et slags download som du kjører alle nedlastingene igjennom. I dette så bruker du headeren (som jeg aldri husker navnet på) som tvinger nettleseren til å vise nedlastingsdialog, uansett filtype. Her spesifiserer du også navnet på filen som lastes ned som et eget headerfelt, og det er kanskje her du kan fikse problemet.

Lenke til kommentar

Har ikke brukt det foreløpig nei. Hvor/når skal denne i så fall brukes?

 

Et eget downloadscript kan jo være en løsning ja, men i dette scriptet må jeg vel fortsatt sende url'en et sted? Har du mulighet til å finne ut hva den headeren heter? Visste ikke at det fantes en gang jeg.

Lenke til kommentar

Har prøvd litt nå med Content-Disposition, og det første problemet var at filen som ble lastet ned var tom. Jeg la derfor inn en funksjon som sjekket om filen eksisterte, hvis ikke skulle den gi feilmelding. I feilmeldingen la jeg i tillegg inn url'en som scriptet spurte etter.

 

Problem 2 ble da at hver gang jeg prøvde å laste ned filen, fikk jeg beskjed om at den ikke fantes (sikkert derfor den tidligere filen var blank), men hvis jeg kopierte url'en som scriptet spurte etter og limte den inn i adressefeltet, lastet den ned filen slik den skulle.

 

Videre prøvde jeg å bruke dette scriptet som jeg trodde var et ferdigscript som skulle fungere. Den inneholdt i tillegg mange flere headere, og noen av dem gjorde i hvert fall så alt fungerte. Alle filer (også de med æøå) virket nå som de skulle.

 

MEN: foreløpig var alt bare testet i Firefox...

Ved testing i Opera og IE er jeg igjen tilbake til det opprinnelige problemet. Filer uten æøå går fint, men så fort de inneholder æøå får jeg følgende beskjed med ferdigscriptet: "NO FILE HERE", hvilket betyr at filen ikke eksisterer.

 

I adressefeltet i IE ser jeg at dokumentet scriptet spør etter er "%c3%85r.doc", mens det egentlige navnet er "År.doc". Å skal vel egentlig erstattes med %C5 ??

 

Det virker på meg som om det er noen konflikter mellom ulike charset-definisjoner, men på dette området vet jeg lite annet enn at det er viktig å spesifisere dem. Som nevnt tidligere viser mb_detect_encoding() at filen (eller filnavnet?) er kodet i UTF-8, mens selve html-dokumentet hvor linken er, har iso-8859-1 som content type/charset.

 

Noen som har noen forslag?

Lenke til kommentar

Mener du at du kalte filen for Aar.doc mens den lå på serveren for så å kjøre denne koden?

header('Content-type: application/msword');
header('Content-Disposition: attachment; filename="År.doc";');
readfile('Aar.doc');

Eller brukte du en annen metode?

 

Dette kan selvfølgelig være en mulighet, men nå som man får kjøpt domener med æøå, så bør man jo også kunne ha disse tegnene i filnavn også. Har i hvert fall lyst til å prøve en liten stund til før jeg gir opp, selv om nytteverdien nå er i ferd med å forsvinne i forhold til tidsforbruket.

Lenke til kommentar

Brukte ikke nedlasting-script med header...

Linket til <a href="download.php?fil=År.doc">År.doc</a>

I download.php kjørte jeg en str_replace av Å til AA, eller noe sånt, og viste deretter filen tror jeg... husker ikke helt...

 

Men, det du skriver over bør vel i teorien funke?

 

Og det er ingen sammenheng i domene- og fil-navn.

Filnavn er avhengig av filsystemet til serveren. ;)

Lenke til kommentar

Joa, vet jo det, men har sett andre sider som får det til, så jeg satser på at det skal gå.

Forslaget ditt blir samme opplegget som skrev i posten over, er bare to forskjellige måter å gjøre det på. Hvis jeg ikke finner ut noe mer går jeg kanskje for en av de løsningene.

 

Men jeg begynner å lure på om dette kan være et server-problem og ikke nettleser/script-problem. På den lokale serveren jeg har satt opp virker ingen av de måtene jeg har prøvd i noen av nettleserne. Så lenge det er æøå i filnavnet får jeg Forbidden. Mens hos webhosten min fungerer det delvis som nevnt over. Er det noen måte jeg ved hjelp av htaccess kan bestemme kodingen av filnavn?

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...