concrete5japan / concrete5

Official public repository for concrete5
http://www.concrete5.org
33 stars 17 forks source link

日本語のファイルをアップロードするとファイル名が空白になる #124

Closed acliss19xx closed 9 years ago

acliss19xx commented 11 years ago

ファイルマネージャーから日本語のファイルをアップロードすると 拡張子のみになる

windowsにFTPでダウンロードしたときファイルが壊れる可能性がある。 windowsはピリオド始まりのファイル名はだめだったと思います。

hissy commented 11 years ago

ファイルアップロード時に拡張子以外が消える可能性がある件、Windowsでダウンロード出来ないとしたら不具合なので、回避策を作りました。取り入れるかはご意見お願いします

acliss19xx commented 11 years ago

windowsでバックアップが取れないのはこまるので、採用に1票。

hissy commented 11 years ago

md5はもとのファイル名を復元できないので、URLエンコードにしたほうがいいんじゃないか、という意見を聞きました。でもURLエンコードするとファイル名が長くなるので、Wordで開かなくなるという話も…。 http://cydn.cybozu.co.jp/office/2008/07/post_1.html

hissy commented 11 years ago

http://social.technet.microsoft.com/Forums/ja-JP/internetexplorerja/thread/5bbc7cd7-8efe-411a-b7b0-7d49c882da49 http://linux.ohwada.jp/modules/smartsection/item.php?itemid=515

acliss19xx commented 11 years ago

元のファイル名の文字コードの問題もあるのでmd5 でいいんじゃないかと思います。

hissy commented 11 years ago

Punycodeという手もある… https://github.com/takezoh/php-PunycodeEncoder

hissy commented 11 years ago

UTF8に変換して不正な記号を取り除くサニタイズを行う、という手段も検討する

hissy commented 11 years ago

RFC2231 http://www.ietf.org/rfc/rfc2231.txt IEだけでなくAndroidも微妙な実装? http://moyolab.blog57.fc2.com/blog-entry-121.html

build1024 commented 11 years ago

お久しぶりです。かなり前に私が言っていたマルチバイト文字の話題が復活したようなので来てみました。個人的には上位互換性+ファイル名の長さという意味でPunycodeを推します。

Androidがどう頑張っても日本語ファイル名でDLできないというのはにわかに信じられなかったので、手持ちのAndroid 4.0端末で実験してみました。 結果的には、標準ブラウザ、Opera Mobile、Dolphin、Chromeのすべてで何の問題もなく動きました。ヘッダは先のHissyさんのリンクでいうところの Content-Disposition: attachment; filename=はぐれメタル.jpg の状態です。 最近のAndroidだと大丈夫ということだと思うのですが、悩ましいですね。

hissy commented 11 years ago

ご無沙汰です!

一応、ファイル名を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のファイル名を使えるかどうか、ということろになるんでしょうか?

hissy commented 11 years ago

とりあえず、使えそうなpunycodeのライブラリ https://github.com/lsolesen/php-idna-converter

build1024 commented 11 years ago

確かに、Punycodeだととりあえずエンコード通してしまって、英数字だとそのまま通るので英語圏の人にも影響が無いし、ダウンロードの際にデコードすればいいのか。

そういうことになりますね。できれば本家にもマージしていただきたいところです。現状で稼働しているconcrete5には影響が出ないはずですので。

でも、ユーザーがダウンロードする際はどのみちUTF-8のまま保存する場合と同じ、RFC2231準拠のヘッダーを送信するしかないので…

ブラウザが日本語名を解釈しないのであればどうしようもないですね。 IEに関してはUser-Agentか何かで判別してShift-JIS名を送って、古いAndroidの場合はMD5か何かで適当に名前を送るとか、そういう対応になるでしょうね。 Android 4.0でRFC 2231準拠のファイル名を解釈するのかどうかはまだ試していません。

hissy commented 11 years ago

後方互換をどこまで考えるかですけど、古いIEは多少問題があってもいいんじゃないかと…。SJIS対応すると、本家に取り込んでもらえなさそうで。

idna extensionがあるっぽいので、存在チェックしてあれば、ライブラリではなくこっちを使った方がいいのかな… http://ngsw.jp/2010/11/19/serv/281.html

acliss19xx commented 11 years ago

拡張子のみになるとwindowsでバックアップができないのは大変問題なのでなんとかならないかと思っています。 他人任せで申し訳ないのですが、作成されたらテストします。よろしくお願いします。

hissy commented 11 years ago

こんな感じでPunycode対応してみました。 どうでしょうかhttps://github.com/hissy/concrete5/commit/b4c89dea331be132fb42b7c9ec749874ef729c8e

本家にプルリクすることを意識して、本家版に対するブランチで作っています。ブランチのzipボタンから落としてこれます。 https://github.com/hissy/concrete5/tree/multibytefilename

あとでサーバー上で確認できる環境を用意したいと思います。

hissy commented 11 years ago

Punycode通すようにしてテストしてるのですが…。Punycodeはアンダーバーを通さないようです。アンダーバーが入っているファイル名の場合、コンバートされずに素通りします。これはいまいちですね…。やはり、ピリオドで始まるファイル名ができてしまった時に回避するという手段が現実的ではないかと思い始めました

hissy commented 11 years ago

Punycodeテスト環境 http://c5filesanitizetest.notnil-creative.biz/