2012-10-08 28 views
6

在浏览Moodle's源代码,我碰到这个偶然发现:BASE64_ENCODE和序列化PHP函数PARAMS

库/最近/ 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编码和序列化的目的是在函数内部立即撤消一次的时候?有没有这样做的正当理由,还是只是过度设计?

+0

没有正当理由这样做,除非这是一个非常大的异常,到目前为止'get_file_size'最常见的用法是获取'serialize'd,'base64_encode'd对象的文件大小。 – Ryan

+0

['function get_file_size'](http://xref.schoolsict.net/moodle/2.2/nav.html?repository/lib.php.source.html#l1367)在moodle源代码中 – air4x

+0

您可以显示以下代码调用'$ this-> get_file_size()'? – NullUserException

回答

2

快速点击他们PHPXref各地揭示了这个功能也被称为在repository_ajax.php

在查询字符串/表单字段根本是行不通的(潜在的)围绕传递序列化的数据,但Base64编码这不是问题。

所以该函数被设计为处理通过ajax,base64解码,反序列化传递的请求,然后返回文件大小。 (这可能与列表节点的source元素相关联)

实质上,调用正在验证编码的字符串是否有效,以便稍后在ajax请求中使用。