ダウンロード時にファイルが壊れる

ダウンロード時にファイルが壊れる

- Nobutomo Uehara の投稿
返信数: 12

はじめまして。

Windows server2003 にfs_moodleをインストールいたしました。
(Microsoftを経由して半自動でインストールできるモジュールを使い、fs化しました。)

日本語化はうまくいったのですが、サイトニュースやフォーラムなどにアップロードしたファイルをダウンロードすると、最後の行が壊れてしまう問題が発生しています。

アップロードしたファイルに問題がないことは、サーバ側において確認いたしました。

テキストファイルで実験を行ったところ、最終行のEOFのOFが消えてしまうことによって発生する問題であろう事までは推測できました。

この現象はファイルの種類を問わず発生しています。

サーバシステムのチェック状況は以下の通りです。

  • サーバOSの種類はWINDOWS(WINNT)であると認識されています.
  • fs_moodleのバージョンはfs_moodle4.03.00(20100408)です.
  • Moodleのバージョンは1.9.8+ (Build: 20100407)(2007101580)です.
  • サーバソフトウェア(Webサーバ)の種類($_SERVER['SERVER_SOFTWARE'])はMicrosoft-IIS/6.0です.
  • $fsCFG->convUTF8serverVariableの設定はtrueです.この設定をtrueに設定すると,$_SERVERスーパーグローバル変数をUTF-8に自動変換します.:WebサーバがIISならば正しい設定です.

このほか、fs_moodleの設定表示ではBOMも含めて特にエラーは発生しておりません。

ご助言いただけないでしょうか。

よろしくお願いいたします。

Nobutomo Uehara への返信

Re: ダウンロード時にファイルが壊れる

- Tatsuya Shirai の投稿
fs_moodleのご利用ありがとうございます。

システム構成の情報はよく分かりました。最初はBOMか、config.php/fsconfig.phpの先頭、末尾に余計な空行があるのでは無いかと疑ったのですが、fs_moodleの設定表示でエラーが無いことを確認されているならば違うでしょうね。

さて、では次のステップです。まずは発生している現象についてもう少し詳しく説明して頂けませんか?

テキストファイル末尾のEOFコードが消えている、サーバ側では欠けていないことを確認とのことですが、どのように確認されました?
「最終行のEOFのOFが消えてしまう」が、すみません、ちょっと分かりません。EOFはWindowsでも0x01aでしょうか、ともかく1byteの制御コードです。この制御コードは削除されただけならばダウンロードしても問題は発生しないと思います。

具体例を示して頂けると原因究明の糸口を得る手掛かりになります。できればバイナリファイルの場合についてもご報告頂けると助かります。
Tatsuya Shirai への返信

Re: ダウンロード時にファイルが壊れる

- Nobutomo Uehara の投稿

早速のお返事ありがとうございます。

はじめに1点勘違いがあったので訂正とお詫びをします。

「EOF」の「OF」が消える件ですが、よくよくチェックすると本文の最終行に平打ちで「EOF」という文字が存在していました。なので、「EOF」コードが消えているのではなく、最後行が壊れていました。すみません。

バイナリエディタで以下の中身(3行)のファイルを使って確認をいたしました。
エディタはサクラエディタを使っています。

123
テスト
test
[EOF]

SJISで保存しアップ後、サーバのデータフォルダ内に保存されているファイルを直接サクラエディタ、メモ帳で見たところ、アップロードしたファイルと同じ物が保存されていました(この段階ではファイルの破損はなし)。

次に、このファイルについてダウンロードし、サクラエディタで開いたところ

123
テスト
tes[EOF]

となります。さらに、このファイルをメモ帳で開くと

123
eXg
tes

となっています(日本語部分がおかしくなります)。

Stirlingというバイナリエディタを使って開いたところ、ファイルの先頭に「EF BB BF」という3バイトが混入して最後の3バイトが無くなっています。上記以外のファイル(例えば他のテキストファイルやPDFファイルなどの形式の違うファイル)についても同様の状況です。なお、EOFの制御コードはバイナリエディタでは見えません(もともと見えないようになっているエディタなのか、知識不足でそのあたりは分かりません)。

以上が、発生している現象についてとりあえず検証していた結果です。

Nobutomo Uehara への返信

Re: ダウンロード時にファイルが壊れる

- Tatsuya Shirai の投稿

http://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%83%9E%E3%83%BC%E3%82%AF

> ファイルの先頭に「EF BB BF」という3バイトが混入して

この頭に挿入された3byteはまさにBOMですね.誰が挿入しているのだろう.

Tatsuya Shirai への返信

Re: ダウンロード時にファイルが壊れる

- Tatsuya Shirai の投稿

 ヘッダーでファイルサイズを指定してMoodleはファイルを送信します.
 ブラウザは指定されたサイズのデータを受け取ったところでファイルを閉じるでしょう(多分).

 もし,BOMの3byteが誤って送信された場合,そこからたとえば100byteのデータを送ったとして,BOM+97byteを受け取ったところでファイルを閉じられてしまう.残りの3byteは行方不明.こんなことが起きていると思われます.

 MoodleがPHPのrequire_once()命令でファイルを読み込む場合に,<?phpより前にある文字列はそのままクライアントに送ってしまいます.?>の後の文字も送ってしまいます.ヘッダーをクライアントに対して送った後に読み込まれたPHPファイルの<?phpより前,?>より後にこれらのゴミがあると,それを本来,送信したいファイルの一部として受け取ってしまった恐れがあります.本来のファイルを送信した後であれば支障は無いのですが.

 勿論,MoodleにアップロードされたファイルにBOMが含まれていた場合はそれも含めてファイルサイズが計算されますのでBOM付きでダウンロードされるので問題はありません.でも,賢いテキストエディタはファイルの頭にBOMの3byte分のデータが含まれていれば,これはUTF-8ファイルだと勝手に認識するでしょう.そのファイルの中身が実際にはシフトJISだとしてもです.これがダウンロードしたシフトJIS形式のファイルが文字化けして表示されるメカニズムです.ダウンロードしたファイルの頭からBOMの3byte分のデータを取り除いたり,強制的に「このファイルはシフトIJISだっ」と指定できるならば,(頭の所に化けた文字列が表示されるものの)途中からは正しく日本語文字列が表示されると思います.お試し下さい.さくらエディタに強制的にシフトJISで開く指定ができるのであれば.

 バイナリファイル(画像)が正しく表示されないのも同じ理由です.バイナリファイルの頭数バイトのデータを見てブラウザは,この画像ファイルだと拡張子やmimeヘッダーが主張している形式であるかどうかを判断していると思います.こちらのページの情報を信じれば,JPEGファイルの場合は,FF D8 FF E0...と始まるはずです.頭にBOMの3byteが紛れ込めば,EE EF BB FF D8 FF E0...となるでしょう.むむ,jpegと名乗りながらも頭がFF D8で始まっていないじゃないか,これを表示しようとしてブラウザをクラッシュさせようという悪意のあるデータファイルの恐れがあるから無視する,という反応に出るでしょう.

 まとめると,誰かがBOMの3byteを送信しています.config.phpとfsconfig.phpでは無さそうですね(fs_moodleの設定表示で検査済みなので).
 何か他のmoodleフォルダ以下のファイルをさくらエディタやメモ帳で開いて保存していませんか?

 ちょっとこれからmoodleフォルダ以下の全ファイルのBOMチェックをするPHPスクリプトを作成してみます.本日中に完成するかどうか分かりません.
 まずはconfig.phpをバックアップした上で,moodleフォルダ以下を別のフォルダ名に変更(moodle2など適当に),新たにfs_moodleパッケージのmoodleフォルダ以下を展開して先ほどバックアップしたconfig.phpをmoodleフォルダにコピーして下さい.これで正しくダウンロードできるのであればmoodleフォルダ以下にBOMの混入したファイルが存在したという証拠(?)になります.

Tatsuya Shirai への返信

Re: ダウンロード時にファイルが壊れる

- Tatsuya Shirai の投稿

 貼付したbomchecker.phpをmoodle/lib/fs_moodle/fs_statusフォルダにコピーして下さい.
 そして,Webブラウザで,http://www.yourdomain.com/moodle/lib/fs_moodle/fs_status/bomchecker.phpを呼び出して下さい(URLは環境に合わせて変更して下さい).管理者権限でのログインを要求されます.

 このスクリプトは$CFG->dirrootで示されたmoodleフォルダ以下の*.php, *.htmlファイルを全てチェックします.もし頭にBOMコードが埋め込まれているファイルがあった場合には,

チェック:C:\xampplite\htdocs\moodle/lib/editor/htmlarea/plugins/DragMath/doc/simple.html → 異常(BOMあり)

のようにエラー表示し,正常なフィルについては,

チェック:C:\xampplite\htdocs\moodle/lib/editor/htmlarea/plugins/DragMath/DragMath Demonstration.html → 正常

のように表示します.もし正常なファイルについては表示したくないのであれば,bomchecker.phpの冒頭のdefine()を以下のようにtrueをfalseに変更して下さい.

     define('BOM_DISPLAYDETAIL', false);

これで異常だと表示されるファイルを調べて下さい.ちなみに以下のファイルは最初からBOMを含んでいます^^; 大目に見てあげてください...

チェック:C:\xampplite\htdocs\moodle/blocks/quickmail/lang/hu_utf8/block_quickmail.php → 異常(BOMあり)
チェック:C:\xampplite\htdocs\moodle/lib/adodb/lang/adodb-bgutf8.inc.php → 異常(BOMあり)
チェック:C:\xampplite\htdocs\moodle/lib/editor/htmlarea/plugins/DragMath/doc/simple.html → 異常(BOMあり)
チェック:C:\xampplite\htdocs\moodle/mod/scheduler/lang/es_utf8/help/scheduler/mods.html → 異常(BOMあり)
チェック:C:\xampplite\htdocs\moodle/mod/scheduler/lang/es_utf8/scheduler.php → 異常(BOMあり)

blocks/quickmailとmod/schedulerはインストールしていない場合,表示されません.
でも,lib/adodbとdragmathはいかんですね(苦笑).本件とは関係ないと思いますが,報告しておいた方がいいかなぁ. 

Tatsuya Shirai への返信

Re: ダウンロード時にファイルが壊れる

- Tatsuya Shirai の投稿

 貼付したbomchecker.phpは次に公開するfs_moodle4.05.00に搭載します.
 このファイルは標準のMoodle環境では動作しません.fs_moodleの専用の関数をいくつか使用しているためです.もし要望があれば汎用のスクリプトとして公開します.

Tatsuya Shirai への返信

Re: ダウンロード時にファイルが壊れる

- Nobutomo Uehara の投稿

お忙しい中、スクリプトまで作成いただき申し訳ありません。

結論からもうしますと、file.phpにBOMがおりました。
私自身がPHPプログラミングなどあまり経験がないため、勉強がてらファイルの中身を色々のぞいたりしているうちに間違えて保存したのだと思います。
私自身の初歩的なミスで、お手数をおかけしてすみません。

ありがとうございました。

#BOMに関しても詳細にご説明いただきありがとうございます。さくらエディタで強制的にシフトJISで開くモードがありましたのでやってみたところ、おっしゃるように頭に化けた文字列が出てきました。

#ただ、Config.phpをコピーした後、Moodleフォルダを上書きしてという、いわゆるアップデートの時の操作をすると、ページ表示権限がない(HTTPエラー401.3:ACLによりアクセスが拒否されました)と表示されました。先は長そうですが、地道に格闘してみたいと思います。

Nobutomo Uehara への返信

Re: ダウンロード時にファイルが壊れる

- Tatsuya Shirai の投稿
file.phpのみをfs_moodleのアーカイブから書き戻してもOKですよ.
Tatsuya Shirai への返信

Re: ダウンロード時にファイルが壊れる

- Nobutomo Uehara の投稿
おっしゃるとおりなのですが、恥ずかしながら最初にその発想にいたりませんでした。
結局BOM無し形式で保存する方法で、ファイルのBOMを消すことで、無事ファイルがダウンロードできるようになりました。
ありがとうございました。
Nobutomo Uehara への返信

Re: ダウンロード時にファイルが壊れる

- Haruhiko Okumura の投稿
後学のためお教えください。
勝手にBOMを付けるエディタって,やっぱりメモ帳でしょうか。
Haruhiko Okumura への返信

Re: ダウンロード時にファイルが壊れる

- Nobutomo Uehara の投稿

メモ帳だと思います・・・と書こうとして、もしかしてさくらエディタの保存時の設定の可能性があるかなと思い、自宅のパソコン(WindowsVistaなのでOSは違うのですが)で確認を行いました。
結果、メモ帳でUTF-8形式の保存を行うとBOMが勝手についてしまいました。
OSのバージョンは違うものの、私がMoodleをインストールしているWindowsServer2003においてもおそらくは同じ挙動を示すのではないかなと思います。

Tatsuya Shirai への返信

Re: ダウンロード時にファイルが壊れる

- Nobutomo Uehara の投稿

バイナリファイルの場合についてですが、どのようなファイルが適当なのかよく分かりませんので、とりあえずそのへんのJPEGファイルをアップロードしてみました。

結果として、画像は表示されません。
×で表示されています。

サーバのデータフォルダ側を覗いてみたのですが、サーバ上ではファイルは正常通り見ることができました。

取り急ぎご報告いたします。
よろしくお願いいたします。