2007年12月20日 星期四

moodle 中文檔名可以正常上傳、下載及壓縮下載

http://plog.yejh.tc.edu.tw/post/2/2089



之前有參考文章讓moodle可以使用中文檔名(讓moodle可以上傳、下載中文檔名 ),但實際使用時,中文檔名或中文目錄可顯示,卻會無法正常下載或檔案連結的問題。後來在Moodle 中文加油站看到有人張貼一篇文章:「Moodle中文檔名上傳與下載與zip壓縮解壓縮問題」,同意他所說檔名big5與utf-8互轉的想法,所以在實際修改程式及測試後,證實上述文章的方法可行。


重新整理這文章及自己moodle修改的過程與方法,紀錄如下:(修改 config.php 設定; 以及 file.php、lib/filelib.php、lib/moodlelib.php、files/index.php四個檔案的部份程式碼)





  1. 在 config.php 增加一行設定值,讓moodle可以正常上傳中文檔名

    $CFG->unicodecleanfilename = true;



  2. file.php 不用修改(之前在「讓moodle可以上傳、下載中文檔名 」這篇文章有紀錄要修改,若有修改者,記得改回來)
     


  3. 修改 lib/filelib.php  ,大約在 307 行,增加 check_browser_version() 檢查瀏覽器類型的一小段程式碼(紅色部份)
     
        //do not put '@' before the next header to detect incorrect moodle configurations,      
        //error should be better than "weird" empty lines for admins/users          
        //TODO: should we remove all those @ before the header()? Are all of the values supported on all servers?
        header('Last-Modified: '. gmdate('D, d M Y H:i:s', $lastmodified) .' GMT';);

        if (check_browser_version()){
            $filename=iconv("UTF-8","Big5",$filename);
        }

        if ($forcedownload) {
            @header('Content-Disposition: attachment; filename='.$filename);
        } else {
            @header('Content-Disposition: inline; filename='.$filename);
        }
     


  4. 修改 lib/moodlelib.php

    4-1. 增加一個 function file_basename ,以取代原來 basename 函數。直接加在程式第一個 function 前就好。
     
    function file_basename($file= null) {
        if($file=== null || strlen($file)<= 0) {
                return null;
        }
        $file= explode('?', $file);
        $file= explode('/', $file[0]);
        $basename= $file[count($file)-1];
        return $basename;
    }



    4-2. 修改 lib/moodlelib.php 中,function zip_files 及 function unzip_file 二個函數庫裡的程式

    第6144行:
        原來的  //$destfilename = $path_parts["basename"];  //The name of the zip file
        改為    $destfilename = file_basename($destination);

    第6232行:
        原來的  // $filestozip .= escapeshellarg(basename($filetozip));
        改為    $filestozip .= escapeshellarg(file_basename($filetozip));
      
    第6261行:
      原來的    //$zipfilename = $path_parts["basename"];  //The name of the zip file
      改為      $zipfilename = file_basename($zipfile);


  5. 修改 files/index.php,修改三段程式碼,把原來的basename改為file_basename

    5-1. 在 case "paste": 修改第288 行,把$shortfile = basename($file); 改為 $shortfile = file_basename($file);

            case "paste":
                html_header($course, $wdir);
                if (isset($USER->fileop) and ($USER->fileop == "move";) and confirm_sesskey()) {
                    foreach ($USER->filelist as $file) {
                        $shortfile = file_basename($file);
                        $oldfile = $basedir.'/'.$file;
                        $newfile = $basedir.$wdir."/".$shortfile;
                        if (!rename($oldfile, $newfile)) {
                            echo "<p>Error: $shortfile not moved</p>";
                        }
                    }
                }
     
    5-2.  在 case "unzip": 修改第519行,把$shortfile = basename($file); 改為 $shortfile = file_basename($file);,方法如5-1。
     
    5-3.  在 case "listzip": 修改第551行,把$shortfile = basename($file); 改為 $shortfile = file_basename($file);,方法如5-1。

在經過上傳、下載、課程備份壓縮、壓縮下載等測試,目前均可以正常運作。RFWU真是厲害!!


http://plog.ptes.tp.edu.tw/post/97/549



沒有留言:

張貼留言