課題提出ファイルの一括ダウンロードについて

課題提出ファイルの一括ダウンロードについて

- katsuhiko murakami の投稿
返信数: 23

moodle開発者フォーラムのトピックを参考にして、moodle1.9.1+に、課題の提出ファイル(単一ファイルのアップロードの場合)を一括ダウンロードできる機能を追加しようと、kawanoさんのパッチ(Ver1.1)をmoodle1.9.1+に適応したのですが、どうしても空っぽのsubmission.zipができ、うまくダウンロードができません。

トピックを参考して、試行錯誤したのですが、うまく動作しません。提出課題はWordの文書ファイル(*.docx)で、提出物の一覧は表示されているので、原因が不明です。

このような場合について、「このあたりの設定を調べては?」などの助言が、ございましたら、お願いします。

katsuhiko murakami への返信

Re: 課題提出ファイルの一括ダウンロードについて

- Minoru Kawano の投稿
こんにちは、kawanoです。

手元の環境は三重大版1.9.0+しかありませんので、今週あたり最新の三重大版1.9.2+(?)で試してみます。Moodleのバージョンが異なるため、問題解決につながらないかもしれませんが…

1.9.1については、下のURLのディスカッションにあるように、とりあえずは動くと思っていたのですが、お使いの環境の問題などもあるかもしれません。
http://moodle.org/mod/forum/discuss.php?d=97680&parent=433496

OSの種類やバージョンなどの情報を教えていただければ、解決策が見つかるかもしれません。また、ディレクトリ(もしくはフォルダ)の書き込み権限や、ApacheなどのWebサーバの実行ユーザ権限なども関係しているかもしれません。

Minoru Kawano への返信

Re: 課題提出ファイルの一括ダウンロードについて

- Tatsuya Shirai の投稿

Kawanoさんの提案を元にして当方(fs_moodle)ではこちらに示すように改善しました.少し当方の都合に合わせて改造しているので,fs_moodle以外の環境ではそのままでは動かない場所もあります(zip_file()関数の3つ目の引数を追加,など).参考程度に.

 一時ファイルをmoodledata/tempフォルダの下に作成したユニークな名前のフォルダにコピーしてからzipします.このフォルダに正常にファイルがコピーされているのかどうか,が,まずチェックすべきところです.

        $archive = new PclZip($tmpdir.'/submission.zip');
        $target = $tmpdir;
        $v_list = $archive->create($target, PCLZIP_OPT_REMOVE_PATH, $tmpdir);

このあたりで一旦処理をdie;させてmoodledata/tempフォルダを見てみてはどうでしょう?

 

Tatsuya Shirai への返信

Re: 課題提出ファイルの一括ダウンロードについて

- katsuhiko murakami の投稿

Kawanoさん、Shiraiさん

アドバイスありがとうございます。

moodleの動作環境は、

FedoraCore8(日本語環境),Apache2, MySql5,PHP5です。Shiraiさんの助言どおりにmoodledata/tempフォルダを見るとsubmission.zipと提出課題がユーザID毎に保存されていました。ダウンロードファイルは作成されていました。

結果として分かったことは、submission.zipは作成されていて、Linuxでzipファイルのファイルリストをunzipコマンドで表示すると、下記のようになります。

$ unzip -l submissions.zip
Archive:  submissions.zip
Length     Date   Time    Name
 --------    ----   ----    ----
           0  08-05-08 09:05   /guest01/
    11149  08-05-08 09:05   /guest01/guest01-report.docx
           0  08-05-08 09:05   /guest02/
    11149  08-05-08 09:05   /guest02/guest02-report.docx
           0  08-05-08 09:05   /guest03/
    11149  08-05-08 09:05   /guest03/guest03-report.docx
 --------                   -------
    33447                   6 files

このzipファイルは、標準WindowsXP環境では表示されないことがわかりました。

Lhasaなどのソフトを利用すれば表示および展開できることが分かりました。

フォルダ名が"/"で始まっているため、表示されないのでしょうか?

とりあえず、英字のファイル名だけですが、一括ダウンロードできることが確認できました。アドバイス、どうもありがとうございました。

katsuhiko murakami への返信

Re: 課題提出ファイルの一括ダウンロードについて

- Tatsuya Shirai の投稿

 つまり”空っぽ”に見えるけれどもファイルサイズがゼロではないzipファイルをクライアントPC側でダウンロードすることは出来ていた,ということですね.なるほど.

 ファイル名がマルチバイト文字列の場合,UTF-8で格納されるとWindows標準の機能ではZIPファイルの中身を見ることができないということでしょうか.私もWindowsの機能は用いずに,Explzhを用いているので気付きませんでした.

#そもそもzipファイルをフォルダ扱いする機能が私の環境では有効になっていないような気もします...何かイジったかな?

Tatsuya Shirai への返信

Re: 課題提出ファイルの一括ダウンロードについて

- Tomohiro Tanikawa の投稿

白井先生

いつもお世話になっております。
Windows上でのMoodle運用をしてきましたが、日本語ファイル名の関係等でこのたびfs_moodleへ移行する準備を進めております。

そのなかで、提出課題の一括ダウンロードも必要機能のひとつとなっております。そこで解決できない問題が2つありましたのでご助言等いただけましたら幸いです。

(その1) 
「このインターネットのサイトを開くことができませんでした。要求されたサイトが使用できないか、見つけることができません。後でやり直してください。」とエラーが出てIEでファイルがダウンロードできない

これは以前にもassignmentフォルダのファイルをダウンロードできないということで話題にあがっていたようでkoga様の記述を参考にして対応してみましたがダメでした。

そのほか情報をあさってみると、以下の以下の情報に今回の状況はOffice文書ではありませんがSSLの利用などマッチします。ただし、課題ではないOffice文書も含むそのほかのファイルでは問題ありませんでした。

Internet Explorer で SSL Web サイトの Office 文書を開けない
http://support.microsoft.com/kb/316431/ja

(その2)
IEではダウンロードできないということでFirefoxで試したところ、保存まではできました。ただし、murakami様と同様中身がありませんでした(Explzh使用)。今回のケースではファイルサイズも0バイトととなっています。これについては先生のところでは問題ないとのことですので、こちらの環境の問題かもしれません。

当方の環境です。

  • サーバ Windows Server 2003 / fs_moodle 9/3版
  • クライアント Windows Vista / IE7 Firefox3  Windows XP / IE6
Tomohiro Tanikawa への返信

Re: 課題提出ファイルの一括ダウンロードについて

- Tatsuya Shirai の投稿

 まず一点です.

 Webサーバは何をお使いでしょうか?
 IISでしたら,fsconfig.php内に,

$fsCFG->convUTF8serverVariable = true;

を記述してみて下さい.もしIISではなく,Apacheをご利用であるならばこの設定は関係ありません.

Tatsuya Shirai への返信

Re: 課題提出ファイルの一括ダウンロードについて

- Tomohiro Tanikawa の投稿

白井先生

ご返信ありがとうございます。
申し訳ございません、環境のところに書いておくべきでした。
WebサーバはApacheを利用しています。

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

Tomohiro Tanikawa への返信

Re: 課題提出ファイルの一括ダウンロードについて

- Tatsuya Shirai の投稿

 あと,お手数ですが,一時的にデバッグメッセージ表示を有効にした状態で実行してみて頂けないでしょうか.

[サイト管理]-[サーバ]-[デバッグ]のページの一番上,デバッグメッセージを”NORMAL”にしてみて頂けないでしょうか.

 実はこの機能,私も近頃あまり使っていませんでした.試してみたところ問題なかったので「よしよし」と思っていたのですが,別の課題の一括ダウンロードを行なったところ”ファイルがコピーできないよ(という意味の”エラーが出てしまいました.多分,コピーできない以上は圧縮しても空っぽのZIP書庫しか作成できないはずです.もしかしたら同じ現象かも知れませんね.ちょっと調査してみます.

Tatsuya Shirai への返信

Re: 課題提出ファイルの一括ダウンロードについて

- Tomohiro Tanikawa の投稿

白井先生

設定を変更して試してみましたので報告いたします。

Firefox
特に何も表示されず0バイトのファイルが保存される

IE6/7
保存は相変わらずできませんが、「開く」について試してみたところ以下のようなエラーが表示されました。

Warning: readfile(D:\xxx\moodledata\yyyy/temp/ハッシュ値?/ファイル名.zip) [function.readfile]: failed to open stream: No such file or directory in D:\xxx\yyyy\lib\fs_moodle\fs_override.php on line 229


Tomohiro Tanikawa への返信

Re: 課題提出ファイルの一括ダウンロードについて

- Tatsuya Shirai の投稿

 どうやら当方で発生した問題とは別の問題のようですね.

 お手数ですが,function download_all_single_submissions()とfunction donwload_all_submissions()の最後に,

        die;
        // sweep file
        $this->rmdir_r($tmpdir);

        exit;
    }

このようにdie;を追加してみて頂けませんか? 中間ファイルを保存しているフォルダを削除する前に処理を強制的に止めてみて,その上で,moodledata/temp/の下の一時フォルダの中をちょっと見て頂けないでしょうか.何か特徴的なことは無いでしょうか?(空っぽである,など)

 正常な場合は,ハッシュ値の一時フォルダ名の下に,課題名のフォルダと課題名.zipの二つが存在します.課題名のフォルダの下にはユーザーidのフォルダが提出された課題の数だけ存在すると思います.

 なお,このdie;を削除し忘れますと,tempフォルダに続々と一時フォルダが作成され続けますので,確認が終わりましたらフォルダの削除とdie;の削除をお忘れなく!


IEとFirefoxで挙動が異なる点に関しては特に思いつくことがありません.なんででしょうねぇ.ヘッダーの前にエラーメッセージが表示された場合の処理の違いでもあるのでしょうか.

Tatsuya Shirai への返信

Re: 課題提出ファイルの一括ダウンロードについて

- Tomohiro Tanikawa の投稿

白井先生

早々にご返信いただいたのに遅くなり申し訳ございません。

早速ご指示いただいた関数の所定の場所でdieさせてtempフォルダを確認してみたところ、フォルダおよびzipファイルが確認できました。

ただし、zipファイルについては先生のおっしゃるような「課題名.zip」ではなく「_.zip」という名前で保存されておりました。なお、zipファイルの中身自体は問題なく見ることができ、きちんとファイルが圧縮されていることも確認できました。

$zipbasename = mb_ereg_replace('[<>"\|:\\/\*\? ]', '_', $assignment->name);
$zipbasename = mb_ereg_replace('_+', '_', $zipbasename);
$zipname     = $zipbasename.'.zip';

このあたりでファイル名がアンダーバーに置き換わっているのかなという程度の理解です。

以上、よろしくお願いいたします。


ちなみに課題名はこれまで日本語でつけておりましたが、ためしに半角英数にしてみたところ、Firefoxでは問題なくzipファイルが保存でき、中身も見ることができました。どうやらマルチバイト文字の課題名のときに起こっているような感じです。


Tomohiro Tanikawa への返信

Re: 課題提出ファイルの一括ダウンロードについて

- Tatsuya Shirai の投稿
 zip書庫は、_.zipという名前になっていたとのことですが、フォルダ名はどうだったですか? 課題名と同じ名前のフォルダ名があり、その中にユーザ名の名前のフォルダが人数分、作成されていましたか?

 あと、もし支障が無いようでしたら、駄目だった時の日本語による課題名を正確に教えて頂け無いでしょうか。当方でも同じ名前の課題を作成し、同じ現象が発生するかどうか確認して見ます。
Tatsuya Shirai への返信

Re: 課題提出ファイルの一括ダウンロードについて

- Tomohiro Tanikawa の投稿

白井先生

お休みのところ恐れいります。

お返事をいただいてからあれこれと試しておりましたが、解決いたしました。原因はなんということはないことでした。

すべての日本語フォルダやファイルでその現象が確認できるということでサイトの問題と考え、パソコンにxamppで構築している環境にfs_moodleをいれて試そうと準備をしているときに、config.phpに対してunicodeのdbやファイル名用に設定を追加したのを思い出しました。

問題の出ている環境では以前のconfig.phpをコピーしたものと思っていたのですが、確認したところ・・・なんとその設定がありませんでした。追加して試したところFirefoxでは無事中身のあるzipファイルを保存することができました。

先生にはいろいろとお時間を割いていただいたにも関わらず、なんともお恥ずかしい結果でした。申し訳ございません。

IEでの問題は解決できておりませんが、一括ダウンロードの機能については利用者が限定されることからFirefoxでひとまず対応していただくようにします。

このたびはありがとうございました。

Tomohiro Tanikawa への返信

Re: 課題提出ファイルの一括ダウンロードについて

- Tatsuya Shirai の投稿

 とりあえず,おめでとうございます!

 さて,SSL環境においてIEで”全ての課題をダウンロード”でzip書庫がダウンロードできない問題に関して,もしかしたらTanikawaさんが一番最初に示されたMicrosoft社の技術情報が関わっている可能性があります.

この問題は、サーバーで SSL (Secure Sockets Layer) が使用され、応答メッセージに次のいずれか、または両方の HTTP ヘッダーが追加されている場合に発生します。

Pragma: no-cache
Cache-control: no-cache,max-age=0,must-revalidate

こうありますよね.そして河野さんの作成されたパッチをベースにしているfs_moodle版でも,zip書庫を作成した後に,これを送信する際に(Moodle共通のファイル送信手段, file.phpを用いずに)ファイルを送信するために,

        header("Cache-Control: none");
        header('Content-Disposition: attachment; filename="'.convert_download_filename_encoding($zipname).'"');
        header("Content-Length: ".fs_filesize($zippath));
        header("Content-Type: application/octet-stream");
        fs_readfile($zippath);

使っていますよ,Cach-Control:noneを.これがいけないのかも?

 ただ,Moodleのhttpsは,特別な修正を行なっていない限りはログインページ(パスワードの送信)のみでしか用いられないはずです.ですのでここでは関係ないとは思うのですが,試しに,download_single_submissions()とdownload_all_submissions()の該当箇所のヘッダー出力を一時的にコメントアウトして試してみて頂けますか?

 あと,die;で処理を中断する実験ですが,IEでもFirefoxでも正しくZIP書庫の作成まではできていることも確認して頂けるととても安心できます.


$CFG->wwwroot = https://www.mydomain.com/moodle

のような指定をされているのでしょうか?

Tatsuya Shirai への返信

Re: 課題提出ファイルの一括ダウンロードについて

- Tomohiro Tanikawa の投稿

白井先生

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

Cach-Control:noneのコメントアウトの件ですが、コメントアウトしても変化はなく同じようなエラーメッセージが表示されました。

tempフォルダ内の確認の件ですが、IE、Firefoxともに書庫の作成は問題ないことが確認できております。

最後のパスの設定では先生のおっしゃるような
$CFG->wwwroot = https://www.mydomain.com/moodle
の形で記述しております。SSL通信に変えたあとに上記記述でなければ接続できなかったように記憶しております。

Tomohiro Tanikawa への返信

Re: 課題提出ファイルの一括ダウンロードについて

- Tatsuya Shirai の投稿

 ZIP書庫がきちんと作成されているとのことで,とても安心しました.ありがとうございます.

 SSL+IEの件は,やはり気になりますね.

 ちなみに,lib/filelib.phpのfunction send_file()やsend_temp_file()では,

    } else { // Do not cache files in proxies and browsers
        if (strpos($CFG->wwwroot, 'https://') === 0) { //https sites - watch out for IE! KB812935 and KB316431
            @header('Cache-Control: max-age=10');
            @header('Expires: '. gmdate('D, d M Y H:i:s', 0) .' GMT');
            @header('Pragma: ');
        } else { //normal http - prevent caching at all cost
            @header('Cache-Control: private, must-revalidate, pre-check=0, post-check=0, max-age=0');
            @header('Expires: '. gmdate('D, d M Y H:i:s', 0) .' GMT');
            @header('Pragma: no-cache');
        }
        @header('Accept-Ranges: none'); // Do not allow byteserving when caching disabled
    }

このようなヘッダーの記述が利用されているような感じが見受けられます.もしかしたら,このコードを移植すればうまく動作する可能性があります.

 ヘッダーの詳細がよく分かっていない上に,自分のサイトをSSL化する方法が分からないので,Tanikawaさんに人柱になって頂くことしかできないのですが...もし可能でしたら,以下のコードを試して頂けませんか? function download_single_submisions()とfunction download_all_submissions()の最後のところです.

//      header("Cache-Control: none");
// ここから追加
        if (strpos($CFG->wwwroot, 'https://') === 0) { //https sites - watch out for IE! KB812935 and KB316431
            @header('Cache-Control: max-age=10');
            @header('Expires: '. gmdate('D, d M Y H:i:s', 0) .' GMT');
            @header('Pragma: ');
        } else { //normal http - prevent caching at all cost
            @header('Cache-Control: private, must-revalidate, pre-check=0, post-check=0, max-age=0');
            @header('Expires: '. gmdate('D, d M Y H:i:s', 0) .' GMT');
            @header('Pragma: no-cache');
        }
        @header('Accept-Ranges: none'); // Do not allow byteserving when caching disabled
// ここまで追加
        header('Content-Disposition: attachment; filename="'.convert_download_filename_encoding($zipname).'"');
        header("Content-Length: ".fs_filesize($zippath));
        header("Content-Type: application/octet-stream");
        fs_readfile($zippath);

もしこれでIEでもダウンロードできるようになるのであればヘッダーの処理の違いに問題がある,ということになります.

 そして更にもう一度,お手間を掛けることになると思いますが,このZIP書庫作成後にファイル送信する処理のコードですが,もしかしたらlib/filelib.php中のfunction send_temp_file()で代用できるかも知れません.これは時間が取れたら試して見ます.send_temp_file()も上記赤いコードが使われていますので,同じ効果が得られる可能性があります.さらにIE向けのハックが含まれているようですので,より確実性が上がる可能性もあります.まずは(非SSL環境で)解析と実験をして見ます.

Tatsuya Shirai への返信

Re: 課題提出ファイルの一括ダウンロードについて

- Tomohiro Tanikawa の投稿

白井先生

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

早速コードを追加して試してみたところIE6、7とも問題なくダウンロードできるようになりました。もちろん書庫自体も問題ありません。

日本語ファイルやフォルダが扱えるようになるという恩恵にあずからせていただいておりますので、fs_moodleのブラッシュアップに協力できればと思います。お手伝いできることであればお声がけください。

Tomohiro Tanikawa への返信

Re: 課題提出ファイルの一括ダウンロードについて

- Tatsuya Shirai の投稿

やった! すごいですね.

例のMicrosoft社の技術情報はドンピシャリでしたね.

次のバージョンではこの成果を元にして,次のスレッドにあるような改良版に変更します.もしお時間がありましたら,send_temp_file()版もお試し頂けると助かります.

Tomohiro Tanikawa への返信

function send_temp_file()版

- Tatsuya Shirai の投稿

 FirefoxとIEで動作を確認しました.

 function download_single_submissions(), download_all_submissions()の最後のzip書庫を送信する箇所をlib/filelib.phpのfunction send_temp_file()を利用するように書き換えました.fs_moodle版ですので,Kawanoさんのバージョンとは少し異なります(ZIP書庫のファイル名やパスの扱い).

 Kawanoさんのバージョンを利用されている方のために,fs_moodleで修正してしまった(追加した)箇所も含めて,ちょっと長いソースを参照しています.見づらくて申し訳ありません.

 ポイントは,function send_temp_file()は,第1引数で指定されたフルパスのファイルを第2引数で指定されたファイル名でクライアント側に強制的ダウンロードの形式で送出します.そして送出した後に,第1引数で指定されたファイルを削除し,dieしてしまいます.従いまして,send_temp_file()した後にファイルを削除できませんので,send_temp_file()で送信する前に作成完了したzip書庫をmoodledata/tempにコピーして,一時作業用のフォルダを削除,それからコピーしたzip書庫をsend_temp_file()で送出しています.

        include_once("$CFG->libdir/pclzip/pclzip.lib.php");
// (T.Shirai): ここからコメントアウト
/*
        $archive = new PclZip($tmpdir.'/submission.zip');
        $target = $tmpdir;
        $v_list = $archive->create($target, PCLZIP_OPT_REMOVE_PATH, $tmpdir);
        if ($v_list == 0) {
            error_log("Error : ".$archive->errorInfo(true));
            $this->rmdir_r($tmpdir);
            exit;
        }

        $zip = file_get_contents($tmpdir.'/submission.zip');
*/
// (T.Shirai): ここから追加
        $sjiszipflag = false;
        $files = array();
        $files[] = $tmpuserdir;
        if (!zip_files($files, $zippath, $sjiszipflag)) {
            error_log("Error : Cannot create zip file");
            $this->rmdir_r($tmpdir);
            exit;
        }
// (T.Shirai): ここまで追加

// (T.Shirai): ここからコメントアウト(SSL+IE対応, 2008/09/08)
/*

        header("Cache-Control: none");
// T.Shirai
//      header("Content-Disposition: attachment; filename=submission.zip");
        header('Content-Disposition: attachment; filename="'.convert_download_filename_encoding($zipname).'"');
// T.Shirai
//      header("Content-Length: ".filesize($tmpdir.'/submission.zip'));
        header("Content-Length: ".fs_filesize($zippath));
        header("Content-Type: application/octet-stream");
// T.Shirai
//      readfile($tmpdir.'/submission.zip');
        fs_readfile($zippath);

        // sweep file
        $this->rmdir_r($tmpdir);

        exit;
*/
// (T.Shirai): ここまでコメントアウト(SSL+IE対応, 2008/09/08)

// (T.Shirai): ここから追加(SSL+IE対応, 2008/09/08)
        // sweep file
        $temppath = $CFG->dataroot.'/temp/'.$zipname;
        fs_copy($zippath, $temppath);
        $this->rmdir_r($tmpdir);

        require_once($CFG->libdir.'/filelib.php');
        send_temp_file($temppath, $zipname);
// (T.Shirai): ここまで追加
    }

 申し訳ありませんが,Tanikawaさん,この修正をfunction download_single_submissions()とdownload_all_submissions()の最後に適用した上で,試して頂けませんか? もしこれでうまく行くようでしたら,Kawanoさん,三重大学版も,オールSSL環境でのIEによるダウンロードに対応するには,同様の改良を施す必要があると思います.

 

Tatsuya Shirai への返信

Re: function send_temp_file()版

- Tomohiro Tanikawa の投稿

白井先生

早速こちらの修正も試してみました。singleのみで試しておりますが、IE6、7とも問題ありませんでした。

これでIEのみでも快適に利用できるようになります。重ね重ねありがとうございます。

Tatsuya Shirai への返信

Re: function send_temp_file()版

- Minoru Kawano の投稿

河野です。こんにちは。

白井先生のコードを参考に、次のようなコードを作ってみました。三重大版Moodleの最新版(Moodle 1.9.2 Build: 20080723)で試したところ、オールSSLではテストできませんでしたが、少なくともSSLなしでは問題なく動作しました。

        // create zip file
        include_once("$CFG->libdir/pclzip/pclzip.lib.php");
        $sjiszipflag = false;
        if (!zip_files($files, $zippath, $sjiszipflag)) {
          error_log("Error : Cannot create zip file");
          $this->rmdir_r($tmpdir);
          exit;
        }

        // sweep temp file
        $tmpzippath = $CFG->dataroot.'/temp/'.$zipname;
        copy($zippath, $tmpzippath);
        $this->rmdir_r($tmpdir);

        // download zip file
        require_once($CFG->libdir.'/filelib.php');
        send_temp_file($tmpzippath, $zipname);

$filesの処理は、この部分より上の方に移動しています。実はこれ以外にも、白井先生の改良を参考にしており、現在コードを整理中です。まとまりましたら、バージョン1.2のパッチとして公開したいと思います。

Tatsuya Shirai への返信

Re: 課題提出ファイルの一括ダウンロードについて

- Tatsuya Shirai の投稿

 ある特定の課題名の課題に関しては,ファイルを提出していないフォルダもコピーしようとして全て失敗している場合がありそうですね.別の課題(44名中6名しか提出されていない課題)では提出されているフォルダのみきちんとコピーできています.

 課題の名前が悪いのか?と思って名前を変えてみた(フォルダ名に使用するので)のですが,それでもNGでした.そういえば提出課題を手で(=エクスプローラ)消したことがあったから,もしかしたらデータベースとの不整合?


 あー,ありますね.問題が.
 mod/assignment/lib.phpに追加しましたfunction download_all_single_submissions()の場合,$userdataという配列にデータベースから$uid, $username, $fullname, $filepathを読み出して一つの配列としてユーザー毎に追加して行っています.この配列の配列を利用して,コースのmoddata/assingmentからデータをコピーします.

 ですので,学生が提出した課題の情報はデータベースに格納されているにも関わらず,(たとえば私が迂闊にも^^;)学生が提出したファイルを手作業で勝手に消してしまうと$filepathに従ってcopy()しようとしてもファイルが存在しないのでエラーになります.

         foreach($userdata as $data) {
            $userdir = $tmpdir.'/'.$data['username'];
            if (!mkdir($userdir)){
                $this->rmdir_r($tmpdir);
                error_log('Cannot create userdir');
                exit;
            }
            $src = $data['filepath'];
            if (!file_exists($src) || !is_file($src)) continue;
            if (!file_exists($src)) {
                $this->rmdir_r($tmpdir);
                error_log('Cannot find source file: '.$src);
                exit;
            }
            $dst = $userdir.'/'.mb_convert_encoding(array_pop(explode("/",$data['filepath'])), 'SJIS-win', 'UTF-8');
            if (!copy($src, $dst)) {
                $this->rmdir_r($tmpdir);
                error_log('Cannot copy file: '.$src.' to '.$dst);
                exit;
            }
        }

とりあえず,手作業で学生が提出したファイルを消してしまった場合に発生する問題に関しては,上のソースの青いブロックの上に赤い行を追加すれば回避できました.青いブロックのエラーチェックが完全に殺されていますが...でも当方で問題が発生した時に,$srcのフルパス名は,フォルダ名であってファイル名が付いていませんでした.そこで!is_file($src)をORで追加した次第です.もしかしたらこれが効果があったのかも知れません.なお,function download_all_submissions()にも同じ箇所がありますので,私のような問題(問題は私...)の場合については,赤い行の追加で回避できます.