私のウェブサイトでは、ユーザーは任意の名前のファイルをアップロードできます。もちろん、一部の名前には非ASCII文字が含まれます。ユーザーがファイルをアップロードすると、元の名前のフォルダーに保存します。ただし、その場所(たとえばfiles/Tolstoy - How much land does a man need?.pdf
)にアクセスしてダウンロードしようとすると、404が表示されます。これを解決して、ファイルが元の名前のままになるようにする方法はありますか?Apache経由で、多分?
3 に答える
ええと、パーセントエンコーディングとしても知られているurlエンコーディングを使用しますか?これは、WebでURLを処理するためのものです。HTMLに出力されるすべてのURLは、URLエンコードされている必要があります。
PHPの場合、rawurlencodeを使用する必要があります。これは、標準に準拠している必要があるためですが、urlencodeは準拠していません。
編集:この問題について
PHPは、「é」を「e%CC%81」ではなく「e%26%23769%3B」としてエンコードします。
e%CC%81
のUTF-8になりé
ます。e%26%23769%3B
はé
、同じHTMLエンティティです。これは、urlencodingの前に明示的なhtmlentities()呼び出しを実行しているか、サーバーセットアップが自動的に実行していることを意味します。適切な文字セットが配置されている場合(実際にはhtmlspecialchars呼び出しのみが必要です)、厳密には必要ありませんが、何も壊してはなりません。
これらをテストしたい場合のいくつかのオンラインツール:
- http://htmlentities.net/を使用して、htmlエンティティの相互変換をテストします
- http://www.hypergurl.com/urlencode.html UTF-8とASCIIの両方を使用して、URLエンコードを前後にテストします
回避策:アップロード時にファイル名をASCIIに変換します。あなたはそれに満足するでしょう。
rawurlencode()
なんらかの理由で、代わりに使用するとうまくいきurlencode()
ました。
ただし、文字é
(とりわけ、私は確信しています) はまだ奇妙にエンコードされています (e%26%23769%3B
単に ではなく%C3%A9
)。さらに奇妙なのは、それを含むリンクが機能することです。