Closed acliss19xx closed 9 years ago
ファイルアップロード時に拡張子以外が消える可能性がある件、Windowsでダウンロード出来ないとしたら不具合なので、回避策を作りました。取り入れるかはご意見お願いします
windowsでバックアップが取れないのはこまるので、採用に1票。
md5はもとのファイル名を復元できないので、URLエンコードにしたほうがいいんじゃないか、という意見を聞きました。でもURLエンコードするとファイル名が長くなるので、Wordで開かなくなるという話も…。 http://cydn.cybozu.co.jp/office/2008/07/post_1.html
元のファイル名の文字コードの問題もあるのでmd5 でいいんじゃないかと思います。
Punycodeという手もある… https://github.com/takezoh/php-PunycodeEncoder
UTF8に変換して不正な記号を取り除くサニタイズを行う、という手段も検討する
RFC2231 http://www.ietf.org/rfc/rfc2231.txt IEだけでなくAndroidも微妙な実装? http://moyolab.blog57.fc2.com/blog-entry-121.html
お久しぶりです。かなり前に私が言っていたマルチバイト文字の話題が復活したようなので来てみました。個人的には上位互換性+ファイル名の長さという意味でPunycodeを推します。
Androidがどう頑張っても日本語ファイル名でDLできないというのはにわかに信じられなかったので、手持ちのAndroid 4.0端末で実験してみました。 結果的には、標準ブラウザ、Opera Mobile、Dolphin、Chromeのすべてで何の問題もなく動きました。ヘッダは先のHissyさんのリンクでいうところの Content-Disposition: attachment; filename=はぐれメタル.jpg の状態です。 最近のAndroidだと大丈夫ということだと思うのですが、悩ましいですね。
ご無沙汰です!
一応、ファイル名をUTF-8のまま保存するというパターンも作ってみました。 https://github.com/hissy/c5_multibyte_patch/blob/master/helpers/file.php
Punycodeの実装も作ってみて、各OS・ブラウザでテストしてみて、最終的に決定出来ればと思いつつ、punycodeの方を作れてません。。
確かに、Punycodeだととりあえずエンコード通してしまって、英数字だとそのまま通るので英語圏の人にも影響が無いし、ダウンロードの際にデコードすればいいのか。
でも、ユーザーがダウンロードする際はどのみちUTF-8のまま保存する場合と同じ、RFC2231準拠のヘッダーを送信するしかないので…
結局、UTF-8のまま保存するのと、Punycodeを通すのの違いは、サーバーがUTF-8のファイル名を使えるかどうか、ということろになるんでしょうか?
とりあえず、使えそうなpunycodeのライブラリ https://github.com/lsolesen/php-idna-converter
確かに、Punycodeだととりあえずエンコード通してしまって、英数字だとそのまま通るので英語圏の人にも影響が無いし、ダウンロードの際にデコードすればいいのか。
そういうことになりますね。できれば本家にもマージしていただきたいところです。現状で稼働しているconcrete5には影響が出ないはずですので。
でも、ユーザーがダウンロードする際はどのみちUTF-8のまま保存する場合と同じ、RFC2231準拠のヘッダーを送信するしかないので…
ブラウザが日本語名を解釈しないのであればどうしようもないですね。 IEに関してはUser-Agentか何かで判別してShift-JIS名を送って、古いAndroidの場合はMD5か何かで適当に名前を送るとか、そういう対応になるでしょうね。 Android 4.0でRFC 2231準拠のファイル名を解釈するのかどうかはまだ試していません。
後方互換をどこまで考えるかですけど、古いIEは多少問題があってもいいんじゃないかと…。SJIS対応すると、本家に取り込んでもらえなさそうで。
idna extensionがあるっぽいので、存在チェックしてあれば、ライブラリではなくこっちを使った方がいいのかな… http://ngsw.jp/2010/11/19/serv/281.html
拡張子のみになるとwindowsでバックアップができないのは大変問題なのでなんとかならないかと思っています。 他人任せで申し訳ないのですが、作成されたらテストします。よろしくお願いします。
こんな感じでPunycode対応してみました。 どうでしょうかhttps://github.com/hissy/concrete5/commit/b4c89dea331be132fb42b7c9ec749874ef729c8e
本家にプルリクすることを意識して、本家版に対するブランチで作っています。ブランチのzipボタンから落としてこれます。 https://github.com/hissy/concrete5/tree/multibytefilename
あとでサーバー上で確認できる環境を用意したいと思います。
Punycode通すようにしてテストしてるのですが…。Punycodeはアンダーバーを通さないようです。アンダーバーが入っているファイル名の場合、コンバートされずに素通りします。これはいまいちですね…。やはり、ピリオドで始まるファイル名ができてしまった時に回避するという手段が現実的ではないかと思い始めました
Punycodeテスト環境 http://c5filesanitizetest.notnil-creative.biz/
ファイルマネージャーから日本語のファイルをアップロードすると 拡張子のみになる
windowsにFTPでダウンロードしたときファイルが壊れる可能性がある。 windowsはピリオド始まりのファイル名はだめだったと思います。