現状では以下のような内容です.
function get_file_url($path, $options=null, $type='coursefile') {
global $CFG;
$path = trim($path, '/'); // no leading and trailing slashes
// type of file
switch ($type) {
case 'coursefile':
default:
$url = "$CFG->wwwroot/file.php";
}
if ($CFG->slasharguments) {
$parts = explode('/', $path);
$parts = array_map('urlencode', $parts);
$path = implode('/', $parts);
$ffurl = "$CFG->wwwroot/file.php/$path";
$separator = '?';
} else {
$path = urlencode("/$path");
$ffurl = "$CFG->wwwroot/file.php?file=$path";
$separator = '&';
}
if ($options) {
foreach ($options as $name=>$value) {
$ffurl = $ffurl.$separator.$name.'='.$value;
$separator = '&';
}
}
return $ffurl;
}
mod/assignment/type/upload/assignment.class.phpの350行目あたりにあるfunction print_user_files()関数の中.
if ($basedir = $this->file_area($userid)) {
if ($files = get_directory_list($basedir, 'responses')) {
require_once($CFG->libdir.'/filelib.php');
foreach ($files as $key => $file) {
$icon = mimeinfo('icon', $file);
$ffurl = "$CFG->wwwroot/file.php?file=/$filearea/$file";
この部分が,一瞬だけ,
$ffurl = "$CFG->wwwroot/file.php?file=". urlencode("/$filearea/$file");
このように変更され,それが(多分,'/'もurlencode()されるとダウンロードできなくなる問題が発生したのでしょう)慌てて元に戻された経緯があります.そしていまはこの部分が,
$ffurl = get_file_url("$filearea/$file");
このようになりました.
新しく作られた関数,function get_file_url()の重要な部分だけ抜き出します.
if ($CFG->slasharguments) {
$parts = explode('/', $path);
$parts = array_map('urlencode', $parts);
$path = implode('/', $parts);
$ffurl = "$CFG->wwwroot/file.php/$path";
$separator = '?';
} else {
$path = urlencode("/$path");
$ffurl = "$CFG->wwwroot/file.php?file=$path";
$separator = '&';
}
$CFG->slashargumentsがtrueの場合は$pathをexplode()で分解してurlencode()しているのですが,falseの場合は以前に慌てて取り消したのと同じように,$pathを全てまとめてurlencode()しています.$pathに'/'が含まれていたら同じことではないのでしょうか.
if ($CFG->slasharguments) {
// $parts = explode('/', $path);
$parts = mb_splt('/', $path);
// $parts = array_map('urlencode', $parts);
$parts = array_map('rawurlencode', $parts);
$path = implode('/', $parts);
$ffurl = "$CFG->wwwroot/file.php/$path";
$separator = '?';
} else {
// $path = urlencode("/$path");
$parts = mb_splt('/', $path);
$parts = array_map('rawurlencode', $parts);
$ffurl = "$CFG->wwwroot/file.php?file=$path";
$separator = '&';
}
この方が良いのではないでしょうか(未確認).あと,関数の頭で余計な'/'を取り除くために,
$path = trim($path, '/'); // no leading and trailing slashes
を行なっていますが,これも少し不安があります.$partsをimplode()した後に'/'を取り除くという訳にはいかなでしょうか.さらに欲を言えば,$pathがUTF-8ではない場合(は無いと思いますが)や逆にWebブラウザが日本版IEの場合を考えるのでればShift-JISに変換して送出するということも考えに入れても良いかも知れません.(これは本家に言うことではありませんが)
UTF-8に'/'に相当するキャラクタコードが含まれることはない,と断言できるのであれば元の通りにexplode()で問題ありませんし,trim()しても良いですが(未調査).