当方の問題だけでなければ良いのですが...
あまり使われていない機能なのでしょうか.
Wikiの”Wikiリンクの選択"プルダウンの一番下にある,”ページのエクスポート”の挙動がどうも気になります.WikiのデータをHTMLのWebページの形式でzip化してクライアント側に送信できる機能です.
動作の実体は,mod/wiki/ewiki/plugins/moodle/moodle_wikidump.phpにあります.
中心的な関数は,function ewiki_page_wiki_dump_send()です.
ダウンロードしたzipファイル(バイナリファイルですが)を強制的にエディタで開いてみてみると,最後尾にHTMLのソースがくっついています.
$archivename=$wname.".zip";
zip_files($filestozip, "$exportbasedir/$archivename");
#-- Headers
Header("Content-type: application/zip");
Header("Content-disposition: attachment; filename=\"$archivename\"");
Header("Cache-control: private");
Header("Original-Filename: $archivename");
Header("X-Content-Type: application/zip");
Header("Content-Location: $archivename");
if(!@readfile("$exportbasedir/$archivename")) {
get_string("exportsuccessful","wiki")."<br />";
if(!deldir($exportbasedir)) {
#exit();
return false;
zip_files($filestozip, "$exportbasedir/$archivename");
#-- Headers
Header("Content-type: application/zip");
Header("Content-disposition: attachment; filename=\"$archivename\"");
Header("Cache-control: private");
Header("Original-Filename: $archivename");
Header("X-Content-Type: application/zip");
Header("Content-Location: $archivename");
if(!@readfile("$exportbasedir/$archivename")) {
error("Cannot read $exportbasedir/$archivename");
}get_string("exportsuccessful","wiki")."<br />";
if(!deldir($exportbasedir)) {
error("Cannot delete $exportbasedir");
}#exit();
return false;
readfile()でzipファイルの中身を標準出力にダーッと出力します.なにをもってしてファイルの終わりであるとクライアント側に判断させるのか,そのメカニズムを知らないのですが,終わったことに気付かずに,エラーメッセージ(上の青文字のerror())までzipファイルのお尻に追加されています.
ソースのインデントも2文字だったり,行末に空白があったり,中カッコの付け方に統一性が無かったり,あまりメンテナンスされていない関数のようです.
自分で作ったWikiをWebページとして公開することができる,かなり便利な機能ですので,もう少しメンテナンスされても良いと思うのですが.
少なくともzipファイルのダウンロードに関しては,もっと良いコードをどこかで見たような気がします.
他にも,リンクファイル名をurlencode()した後に+を""にリプレースして取り除いたり(そもそもrawurlencode()で済ませて欲しい)など,ファイル名の扱いにも色々と”仕様上の悩み”が見て取れます.
Wikiのエクスポートの機能を使っている方,使い勝手は如何です? 以上の問題は当方の環境だけの問題でしょうか?
#近頃,moodleといえばWikiというくらい,仕事の道具としてWikiに依存し始めています.
headerを出力したあとにreadfile()を使うのは普通に行なわれることのようですね.
http://www.microsoft.com/japan/msdn/asp.net/tips/download/
なにをもってしてファイル終端であることを判断するのだろう???
http://dns5.m-craft.com/mc_kadai/hamamura/pukiwiki/index.php?%A5%D5%A5%A1%A5%A4%A5%EB%A4%CE%A5%C0%A5%A6%A5%F3%A5%ED%A1%BC%A5%C9
(上の2つ目のページを参考に)
// ダウンロードファイルを出力
$fname = $path . $fname;
header("Content-type: " . $mime);
header("Content-Disposition: attachment; filename=" . $fname);
header("Content-length: " . filesize( $fname));
readfile( $fname);
青い文字で表したContent-lengthが指定されていませんね.それでセッションの終わりまでに出力された文字列まで全てzipファイルのお尻につけてしまうのじゃないのかな?