6

Moodle のソースコードをブラウジングしているときに、私はこれに出くわしました:

リポジトリ/最近/lib.php

public function get_listing($encodedpath = '', $page = '') {
    global $OUTPUT;
    $ret = array();
    $ret['dynload'] = true;
    $ret['nosearch'] = true;
    $ret['nologin'] = true;
    $list = array();
    $files = $this->get_recent_files(0, $this->number);

    try {
        foreach ($files as $file) {
            $params = base64_encode(serialize($file));
            // Check that file exists and accessible
            $filesize = $this->get_file_size($params);
            if ($file['filename'] == 'image.png') {
              var_dump($filesize);
            }
            if (!empty($filesize)) {
                $node = array(
                    'title' => $file['filename'],
                    'size' => $filesize,
                    'date' => '',
                    'source'=> $params,
                    'thumbnail' => $OUTPUT->pix_url(file_extension_icon($file['filename'], 32))->out(false),
                );
                $list[] = $node;
            }
        }
    } catch (Exception $e) {
        throw new repository_exception('emptyfilelist', 'repository_recent');
    }
    $ret['list'] = array_filter($list, array($this, 'filter'));
    return $ret;
}

リポジトリ/lib.php

public function get_file_size($source) {
    $browser    = get_file_browser();
    $params     = unserialize(base64_decode($source));
    $contextid  = clean_param($params['contextid'], PARAM_INT);
    $fileitemid = clean_param($params['itemid'], PARAM_INT);
    $filename   = clean_param($params['filename'], PARAM_FILE);
    $filepath   = clean_param($params['filepath'], PARAM_PATH);
    $filearea   = clean_param($params['filearea'], PARAM_AREA);
    $component  = clean_param($params['component'], PARAM_COMPONENT);
    $context    = get_context_instance_by_id($contextid);
    $file_info  = $browser->get_file_info($context, $component, $filearea, $fileitemid, $filepath, $filename);
    if (!empty($file_info)) {
        $filesize = $file_info->get_filesize();
    } else {
        $filesize = null;
    }
    return $filesize;
}

私の質問は、関数内ですぐに元に戻されたときに、これを base64 エンコードしてシリアル化する目的は何ですか? これを行う正当な理由はありますか、それとも過剰に設計されているだけですか?

4

1 に答える 1

2

PHPXref をすばやくクリックすると、この関数がrepository_ajax.phpでも呼び出されていることがわかります。

シリアル化されたデータをクエリ文字列/フォーム フィールドで渡すことは (潜在的に) うまくいきませんが、base64 エンコーディングではこれは問題になりません。

そのため、この関数は、ajax、base64 デコード、デシリアライズを介して配信された要求を処理し、ファイル サイズを返すように設計されています。(これはおそらくsourceリストノードの要素にもリンクされています)

本質的に、呼び出しは、エンコードされた文字列が後で ajax リクエストで使用されるときに有効であることを確認しています。

于 2012-10-10T10:34:15.817 に答える