以前に投稿した上記問題ですが,実際にMoodle2.4をインストールして使って見たところ,サイト管理内の”プラグイン”→”リポジトリ”→”ファイルシステム”で実現できていることに気付きました.インスタンスを追加することで,moodledata/repositoryの下に作成したフォルダ内のファイルをファイルピッカーでMoodle上にて参照可能でした.他にもWebDAVのリポジトリがありますので,これでも良いかも知れませんね(私の環境では,QNAPのNASとの間でWebDAVの認証が,まだ通っていませんが…).
さて,これでMoodle2.4のサイトに対してApache/PHPの最大アップロードファイルサイズの制約を受けずにファイルのアップロードが可能であることは確認できました.
ただ,ファイルピッカーという一方向(外部からMoodleサイトへのデータの送信のみ)のファイラーですと,今度は逆方向,Moodleサイトからクライアントの端末への巨大なファイルの転送ができません.ダウンロードの機能はあるのですが,たとえばコースバックアップファイルが11GBにもなってしまうと,うんともすんとも言いません(もっと小さなファイルならばダウンロードできることを確認しました).せめて何かしらエラーが出れば良いのですが.
もしかしたら何か設定の見落としで,11GBのファイルであろうともダウンロードできるのかも知れませんが,MoodleのサーバとLANで直結できる環境にあったとしてもWebブラウザ経由でのダウンロードしかできないのは勿体ない.
moodledata/filedirの下に格納されているファイルは,管理情報をDBに持っており,ファイル名(フルパス名込み)をハッシュ化されたファイルをサーバのmoodledata/filedirから探し出してきて手元にコピーするのも簡単ではありません.
ちなみに,Moodle上の論理的なファイル格納領域内の特定のファイルのリアルなフルパス名を取得する関数は,moodle/lib/filestorage/stored_file.php内のclass stored_fileのprotected function get_content_file_location()です.そう,protectedであり,”NOTE: do not make this public, we must not modify or delete the pool files directly!
"とのこと.DBの情報を削除しないでファイルだけ消すと不一致が生じるから,という心配はよく分かります.でも,ちょこっと見てみたいので,protectedをpublicに変えた,
public function get_content_file_location2() {
return $this->get_content_file_location();
}
などという呼び出しを追加して実験をしてみました.その上で,moodle/lib/filelib.php内のfunction file_get_drafarea_files()に,
foreach ($files as $file) {
$item = new stdClass();
$item->filename = $file->get_filename();
$item->filepath = $file->get_filepath();
$item->fullname = trim($item->filename, '/');
$filesize = $file->get_filesize();
$item->size = $filesize ? $filesize : null;
$item->filesize = $filesize ? display_size($filesize) : '';
// (Shirai)
$item->contentpath = $file->get_content_file_location2();
// (Shirai) $item->sortorder = $file->get_sortorder();
$item->author = $file->get_author();
のように1行追加すれば,ファイルピッカーでサイト内のファイル(たとえば”リストア”でバックアップファイルエリアのファイルなども含めて)の情報(ファイル名その他)と一緒にリアルなフルパス名が得られるところまでは確認しました.ただ,ファイルピッカーのレンダラーがJavaScrioptなので私にはこれから先はお手上げでした….
もちろん,冷静に考えれば私がしたいことといえば,ファイルピッカーでリストアップされるファイルを1個単位で構わないからmoodledata/tempフォルダあたりに書き出したいだけです.そうであれば,class stored_file内のpublic function copy_content_to()以下の関数を使えば良いだけなのですが.結局はファイルピッカーが”高級なプログラム”過ぎて手が出せずにいます.どなたか,ファイルピッカーの画面で,ダウンロードの代わりに(ユーザが管理者権限を持つ場合は)ファイルシステムにコピーする機能を組み込んで頂けないでしょうか.
あるいは逆方向(Moodleの論理ファイルシステムからリアルなOSのファイルシステムへ)にもファイルをコピー可能なブロックがあるよ,といった情報をお持ちの方,ご回答頂けますと助かります.