6月から本校のMoodleも本家版からfs_moodleに変更されることになり,試験的な運用を開始しました.
ある先生から問題の指摘があり,その件を調べている際に別の問題に気付きました.
コースにリソースでC++言語のソースファイルを”ファイルまたはウェブサイトにリンク”で割り当てた場合に,”ダウンロードを強制する”をチェックしていないにも関わらず,ブラウザにIEを用いるとファイルがダウンロードされてしまいます.Firefoxの場合はブラウザ内にインライン表示されます.
色々とメカニズムを調べたのですが,決定的な証拠には欠けますが,皆さん,色々と苦労していることが分かりました.大半は,Content-Dispositionをヘッダーに指定した際に,attachmentをオプションに付けると2度ダウンロードされる,というものです.この問題の対策がattachmentではなくinlineを指定すれば1度しかダウンロードされないというものです.これはおかしな話です.本来はブラウザ内にmimetypeにしたがって表示されるはず.
拡張子.cppの場合,Moodleではmimetypeは"text/plain"ですので,inlineをオプションとして付ければブラウザ内に表示されるはずです(Firefoxは表示されます)が,$forcecdownloadがfalseでもIEの場合はダウンロードされてしまいます.ところがリソースとして拡張子".txt"のファイルを”ファイルまたはウェブサイトにリンク”で割り当てた場合は,IEであってもブラウザ内にインライン表示されます.この現象から考えると,IEはContent-Dispositionのオプションがinlineであっても,filename=の拡張子によって動作を変えているらしい.なんらかのマイクロソフト社の思惑に基づく仕様ではないでしょうか.
暫定的な解決策として以下の方法を試したところ,うまく行きました.方法は,Content-Dispositionのfilename=のファイル名(例えばhoge.cpp)に勝手に".txt"を追加する(例えばhoge.cpp.txt)手です.これでFirefox, IEとで同じ挙動(インライン表示)をするようになりました.
lib/filelib.php, function send_file()
if ($forcedownload) {
@header('Content-Disposition: attachment; filename="'.$filename.'"');
} else {
// @header('Content-Disposition: inline; filename='.$filename);
// (IE_Problem025): ここから追加
if (check_browser_version('MSIE')) {
@header('Content-Disposition: inline; filename="'.$filename.'.txt"');
} else {
@header('Content-Disposition: inline; filename="'.$filename.'"');
}
// (IE_Problem025): ここまで追加
元々,ダウンロードされる訳ではないのでファイル名に.txtをMoodle側で付けても問題は無いでしょう.