php - Hvordan gemmer du uploadede filer med ikke-ASCII filnavn?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg kan ikke sende et UTF-8 filnavn til move\_uploaded\_file(), da det bliver konverteret bytewise, hvilket resulterer i et defekt navn i filsystemet. For eksempel: [10]


move\_uploaded\_file($\_FILES['userfile']['tmp\_name'], 'uploadé.jpg');


opretter xa9.jpg i upload-biblioteket.


Mens Windows API understøtter UTF-16 , fører et sådant filnavn (f.eks. iconv('UTF-8', 'UTF-16', 'é')) til move\_uploaded\_file() en fejl. [11]


Det ville være rimeligt at procentkode alle specialtegn, og jeg skulle bestemt gøre det samme med URI'erne i henhold til RFC 3986. Men når jeg bruger procentkodede URI'er, giver Apache en 404 fejl, som det dekoder URL'en og kan ikke finde noget ved det navn. [12]


For eksempel: <img src="/upload/\%C3\%A9.jpg" /> giver Apache fejlen:



  Filen findes ikke: [[...]]/upload/\xc3\xa9.jpg.



Hvad ville være den rigtige løsning? Hvis jeg omdøber filen i Windows ( é.jpg ), fungerer den kodede HTML URI (\% C3\% A9.jpg ) som forventet.





Nogle oplysninger om emnet: http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php[13]

Bedste reference


Passerer iconv('UTF-8', 'Windows-1250', $\_FILES['userfile']['name']) til move\_uploaded\_file(), i modsætning til at bruge UTF-16 og gemmer filnavnet til HTML som rawurlencode($\_FILES['userfile']['name']) værker.


Hvis dette filnavn er gemt i en database, skal enhver filanmodning henvise til iconv('UTF-8', 'Windows-1250', rawurldecode($filename)).


Jeg bruger Windows-1250 charater sæt, da dette er standard på mit system.


Yderligere information om MSDN:



  • Tegnsæt bruges i filnavne (Se: Kode sider) [14] [15]

  • Fil- og katalognavne (Naming Conventions) [16]