トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

BugTrack-wiki/337

ページの作成や編集にはユーザ登録が必要です。

日本語ファイル名のファイル添付に制約がある

  • 投稿者: jo
  • カテゴリ: 本体
  • 優先度: 緊急
  • 状態: 提案
  • 日時: 2010年02月27日 21時28分09秒

 内容

ファイルを添付してアップロードする場合にファイル名の長さによってファイルがアップロードできない。ファイルに使用している文字によって長さは異なる。No such file or directory at lib/Wiki.pm line 578 at lib/Util.pm line 679

 コメント

  • 半角スペース2個入りも許容外のようです。 - 名無しさん (2010年03月01日 08時58分29秒)
  • 環境によって違いませんか?ためしに半角スペース2個入りをここに上げてみましたが、1個になるようですね。 - 名無しさん (2010年03月01日 09時27分51秒)
  • 確かに環境で違うようです。私の使用環境ではひらがなでは、52文字までしかアップできませんでした。 - jo (2010年03月01日 12時58分30秒)
  • カタカナ、漢字も同じ。混在はさらに短く30文字でした。 - jo (2010年03月01日 13時02分19秒)
  • 添付ファイル名の長さに制限があるのは FSWiki の仕様といえるのではないでしょうか。FSWiki の添付ファイルは、具体的には下記の形式のファイル名でサーバのファイルシステム上に保存されます。一般に、サーバの OS のファイルシステムにはファイル名の長さ制限がある(具体的な制限の内容は、OS によって異なります)ので、ある一定の長さを超えたファイル名のファイルは保存することができません。 - 菜梨 (2010年03月01日 13時45分50秒)

サーバのファイルシステム上での FSWiki の添付ファイル名

./attach(/farm名)/(添付先の Wiki ページ名の url_encode 文字列).(添付時の添付ファイル名の url_encode 文字列)
    • よって、添付先の Wiki ページ名が長いと、許容できる元の添付ファイル名は短くなります。
    • 文字によって制限長が変わるのは、文字によって 1 文字をあらわす Byte 長が 1 Byte 〜 3 Byte の範囲で変わるためです。また、url_encode することにより、さらに消費 Byte 長は増加します。
  • サーバファイルシステムのファイル名長さ制限に由来するこの制限を、FSWiki 側で対処して無制限にするのは不可能ではありませんが大変困難であり、実行速度の低下などのデメリットを生ずる恐れがあります。そのようなデメリットを受け入れてまで対策しなければならないほど、実使用上で支障がある問題なのでしょうか? - 菜梨 (2010年03月01日 13時47分25秒)
  • FSWikiの仕様であれば問題ありません。長いファイル名の文書をユーザーが意識してアップロードするのが不便だったもので。システム的にデメリットしかないようなので、運用でカバーいたします。ご説明ありがとうございました。 - jo (2010年03月01日 14時50分14秒)
  • それなりのエラーメッセージがでると親切かもしれないですね - 名無しさん (2010年03月01日 16時51分52秒)
  • もしくは、FAQ的なところに記述があると良いですね。既に書かれていたらごめんなさい。 - 名無しさん (2010年03月01日 18時16分34秒)
  • 「エラーメッセージが出ると親切」というご指摘はその通りだと思います。そこで、試しに次のように変更してみましたが、結果は、サーバ OS に依存してしまいます。 - 菜梨 (2010年03月01日 23時09分10秒)
--- ../wiki3_6_3_1.orig/plugin/attach/AttachHandler.pm    2009-01-04 10:11:03.000000000 +0900
+++ plugin/attach/AttachHandler.pm    2010-03-01 22:49:54.000000000 +0900
@@ -65,7 +65,7 @@ sub do_action {
                        return $wiki->error("ファイルの上書きは許可されていません。");
                }

-               open(DATA,">$uploadfile") or die $!;
+               open(DATA,">$uploadfile") or return $wiki->error("$!: 添付ファイルの書込みオープンに失敗しました。");
                binmode(DATA);
                while(read($hundle,$_,16384)){ print DATA $_; }
                close(DATA);

サーバ OS が FreeBSD の場合:File name too long: 添付ファイルの書込みオープンに失敗しました。

サーバ OS が Windows XP の場合:No such file or directory: 添付ファイルの書込みオープンに失敗しました。

  • これらのエラーメッセージの前半部分は、OS が出力するエラーメッセージ($!)です。Windows XP のように OS が出力するエラーメッセージが適切でない場合を考慮すると、FSWiki 側でエラー原因調査処理を追加する必要があります。しかし、FSWiki が直接検知できるのは「添付ファイルをサーバファイルシステム上に保存する際、書込みファイルを open しようとしたら失敗した」ということのみなので、本当にファイル名の長さが問題かどうかを調べるには、「ファイル名をだんだん短くしてゆき、どこかで成功したらファイル名が長すぎると判断する」というような処理(繰り返しファイルオープン)になり、とても煩雑です。そこで、次のようなエラーメッセージを出すにとどめるのが落としどころではないでしょうか。 - 菜梨 (2010年03月01日 23時12分12秒)
--- ../wiki3_6_3_1.orig/plugin/attach/AttachHandler.pm    2009-01-04 10:11:03.000000000 +0900
+++ plugin/attach/AttachHandler.pm    2010-03-01 22:36:04.000000000 +0900
@@ -65,7 +65,10 @@ sub do_action {
                        return $wiki->error("ファイルの上書きは許可されていません。");
                }

-               open(DATA,">$uploadfile") or die $!;
+               open(DATA,">$uploadfile") or return $wiki->error(
+                       "$!: 添付ファイルの書込みオープンに失敗しました"
+                       . "(もしも添付ファイル名が長いなら、短くすると成功するかもしれません)。"
+               );
                binmode(DATA);
                while(read($hundle,$_,16384)){ print DATA $_; }
                close(DATA);

No such file or directory: 添付ファイルの書込みオープンに失敗しました(もしも添付ファイル名が長いなら、短くすると成功するかもしれません)。

  • そうですよね。本エラーメッセージになるだけでもずいぶんユーザーに優しくなりますね。ありがとうございます。 - jo (2010年03月02日 00時01分09秒)
  • ちなみにダウンロード時の読み出しがsub do_action内にありますのでエラー対応にはそこにも同様な変更が望ましいのかも。 - 名無しさん (2010年03月02日 13時48分57秒)
お名前: コメント: