From 1e28c767bc02a1111a0347acbaf670429b5ba9fa Mon Sep 17 00:00:00 2001 From: dongsheng Date: Thu, 17 Jul 2008 03:54:20 +0000 Subject: [PATCH] MDL-15349 1. Implement downloading files from repositories to temp area, TODO, communicate with FILE API 2. Fix cookie bugs in curl class 3. Fix bugs of boxnet and flickr plugins --- repository/ajax.php | 32 ++++++++++++------ repository/boxnet/repository.class.php | 10 ++++-- repository/curl.class.php | 5 ++- repository/flickr/phpFlickr.php | 6 ++-- repository/flickr/repository.class.php | 45 +++++++++++++++++++++++--- repository/lib.php | 19 ++++++----- repository/ws.php | 20 +++++++++--- 7 files changed, 102 insertions(+), 35 deletions(-) diff --git a/repository/ajax.php b/repository/ajax.php index 8b26ac7cea..13de61bcfe 100644 --- a/repository/ajax.php +++ b/repository/ajax.php @@ -182,20 +182,20 @@ function openpicker(){ select.on('click', function(e){ var nodes = YAHOO.util.Selector.query('input:checked'); var str = ''; + var files = []; for(k in nodes){ - str += (nodes[k].value+'\n'); + files.push(nodes[k].value); } - // TODO - // Call ws.php to download these files - alert(str); + loading(); + var trans = YAHOO.util.Connect.asyncRequest('POST', 'ws.php?id='+repositoryid+'&action=download', loadfile, postdata({'files':files})); }) var search = new YAHOO.util.Element('search'); - search.on('click', function(e){ + search.on('click', function(e) { if(repositoryid==0){ alert('Select a repository first.'); return; } - var data=window.prompt("What are you searching for?"); + var data = window.prompt("What are you searching for?"); if(data != null && data != '') { dosearch(data); } @@ -205,12 +205,15 @@ function openpicker(){ function postdata(obj) { var str = ''; for(k in obj) { - if(str == ''){ - str += '?'; + if(obj[k] instanceof Array) { + for(i in obj[k]) { + str += (encodeURIComponent(k) +'[]='+encodeURIComponent(obj[k][i])); + str += '&'; + } } else { + str += encodeURIComponent(k) +'='+encodeURIComponent(obj[k]); str += '&'; } - str += encodeURIComponent(k) +'='+encodeURIComponent(obj[k]); } return str; } @@ -304,6 +307,17 @@ success: function(o) { } } } +var loadfile = { + success: function(o) { + try { + var ret = YAHOO.lang.JSON.parse(o.responseText); + } catch(e) { + alert('Invalid JSON String\n'+o.responseText); + } + var panel = new YAHOO.util.Element('panel'); + panel.get('element').innerHTML = '

Download Successfully!

'; + } +} function cr(id, path, reset){ viewbar.set('disabled', false); diff --git a/repository/boxnet/repository.class.php b/repository/boxnet/repository.class.php index 9ff4f6a211..85997617c5 100755 --- a/repository/boxnet/repository.class.php +++ b/repository/boxnet/repository.class.php @@ -1,6 +1,6 @@ box_token)) { $this->box = new boxclient($options['api_key'], $SESSION->box_token); $options['auth_token'] = $SESSION->box_token; - $action = 'list'; + if(!empty($actio)) { + $action = 'list'; + } } else { $this->box = new boxclient($options['api_key'], ''); - $action = ''; + if(!empty($action)) { + $action = ''; + } } parent::__construct($repositoryid, $context, $options); } diff --git a/repository/curl.class.php b/repository/curl.class.php index 626c718794..92be67caff 100644 --- a/repository/curl.class.php +++ b/repository/curl.class.php @@ -51,9 +51,7 @@ class curl { $this->debug = true; } if(!empty($options['cookie'])) { - if(file_exists($options['cookie'])) { - $this->cookie = $options['cookie']; - } + $this->cookie = $options['cookie']; } if(!empty($options['cache'])) { if(class_exists('repository_cache')) { @@ -266,6 +264,7 @@ class curl { * )); */ public function download($requests, $options = array()) { + $options['CURLOPT_BINARYTRANSFER'] = 1; $options['RETURNTRANSFER'] = false; return $this->mulit_request($requests, $options); } diff --git a/repository/flickr/phpFlickr.php b/repository/flickr/phpFlickr.php index 872afe2832..8e877cd3be 100755 --- a/repository/flickr/phpFlickr.php +++ b/repository/flickr/phpFlickr.php @@ -23,7 +23,6 @@ * 4. Clean up session code * */ -require_once('../config.php'); class phpFlickr { var $api_key; @@ -199,13 +198,12 @@ class phpFlickr { $redirect = $_SERVER['REQUEST_URI']; } //$api_sig = md5($this->secret . "api_key" . $this->api_key . "extra" . $redirect . "perms" . $perms); - echo $this->secret . "api_key" . $this->api_key . "perms" . $perms; $api_sig = md5($this->secret . "api_key" . $this->api_key . "perms" . $perms); if ($this->service == "23") { header("Location: http://www.23hq.com/services/auth/?api_key=" . $this->api_key . "&extra=" . $redirect . "&perms=" . $perms . "&api_sig=". $api_sig); } else { - //header("Location: http://www.flickr.com/services/auth/?api_key=" . $this->api_key . "&extra=" . $redirect . "&perms=" . $perms . "&api_sig=". $api_sig); - echo 'Login'; + $url = 'http://www.flickr.com/services/auth/?api_key=' . $this->api_key . "&perms=" . $perms . '&api_sig='. $api_sig; + echo 'Authentication'; } //exit; } else { diff --git a/repository/flickr/repository.class.php b/repository/flickr/repository.class.php index ba98b625e2..2472515424 100755 --- a/repository/flickr/repository.class.php +++ b/repository/flickr/repository.class.php @@ -29,7 +29,9 @@ class repository_flickr extends repository{ } if(!empty($SESSION->flickrmail)) { - $action = 'list'; + if(empty($action)) { + $action = 'list'; + } } else { $options['flickrmail'] = optional_param('flickrmail', '', PARAM_RAW); if(!empty($options['flickrmail'])) { @@ -40,12 +42,16 @@ class repository_flickr extends repository{ set_user_preference('flickrmail', $options['flickrmail']); } $SESSION->flickrmail = $options['flickrmail']; - $action = 'list'; + if(empty($action)) { + $action = 'list'; + } } } else { if($account = get_user_preferences('flickrmail', '')){ $SESSION->flickrmail = $account; - $action = 'list'; + if(empty($action)) { + $action = 'list'; + } } } } @@ -99,7 +105,7 @@ EOD; $p['title'] = get_string('notitle', 'repository_flickr'); } $ret->list[] = - array('title'=>$p['title'],'source'=>'http://farm2.static.flickr.com/'.$p['server'].'/'.$p['id'].'_'.$p['secret'].'_b.jpg','id'=>$p['id'],'thumbnail'=>$this->flickr->buildPhotoURL($p, "Square")); + array('title'=>$p['title'],'source'=>$p['id'],'id'=>$p['id'],'thumbnail'=>$this->flickr->buildPhotoURL($p, 'Square')); } return $ret; } @@ -139,5 +145,36 @@ EOD; echo ''; return true; } + public function get_file($photo_id){ + global $CFG; + $result = $this->flickr->photos_getSizes($photo_id); + $url = ''; + if(!empty($result[4])) { + $url = $result[4]['source']; + } elseif(!empty($result[3])) { + $url = $result[3]['source']; + } elseif(!empty($result[2])) { + $url = $result[2]['source']; + } + if (!file_exists($CFG->dataroot.'/repository/download')) { + mkdir($CFG->dataroot.'/repository/download/', 0777, true); + } + if(is_dir($CFG->dataroot.'/repository/download')) { + $dir = $CFG->dataroot.'/repository/download/'; + } + if(file_exists($CFG->dirroot.'/repository/curl.class.php')) { + $file = $photo_id.'_'.time().'.jpg'; + $fp = fopen($dir.$file, 'w'); + require_once($CFG->dirroot.'/repository/curl.class.php'); + $c = new curl; + $c->download(array( + array('url'=>$url, 'file'=>$fp) + )); + return $dir.$file; + } else { + return '!!!fail!!!'; + } + return $result; + } } ?> diff --git a/repository/lib.php b/repository/lib.php index b957c357ec..fafa432228 100644 --- a/repository/lib.php +++ b/repository/lib.php @@ -104,20 +104,23 @@ abstract class repository { * @param string $url the url of file * @param string $file save location */ - public function get_file($url, $file) { + public function get_file($url) { global $CFG; + if (!file_exists($CFG->dataroot.'/repository/download')) { + mkdir($CFG->dataroot.'/repository/download/', 0777, true); + } + if(is_dir($CFG->dataroot.'/repository/download')) { + $dir = $CFG->dataroot.'/repository/download/'; + } if(file_exists($CFG->dirroot.'/repository/curl.class.php')) { - if(!file_exists($file)){ - return null; - } else { - $file = fopen($file, 'w'); - } + $file = uniqid('repo').'_'.time().'.tmp'; + $fp = fopen($dir.$file, 'w'); require_once($CFG->dirroot.'/repository/curl.class.php'); $c = new curl; $c->download(array( - array('url'=>$url, 'file'=>$file) + array('url'=>$url, 'file'=>$fp) )); - return true; + return $dir.$file; } else { return null; } diff --git a/repository/ws.php b/repository/ws.php index c767a679cc..fc270bfe5a 100644 --- a/repository/ws.php +++ b/repository/ws.php @@ -1,15 +1,18 @@ repository_cache_expire = 12000; // repository id -$id = optional_param('id', PARAM_INT); +$id = optional_param('id', PARAM_INT); // action of client -$action = optional_param('action', '', PARAM_RAW); +$action = optional_param('action', '', PARAM_RAW); // path -$p = optional_param('p', '', PARAM_RAW); +$p = optional_param('p', '', PARAM_RAW); // Search text -$search = optional_param('s', '', PARAM_RAW); +$search = optional_param('s', '', PARAM_RAW); +// files to be downloaded +$files = optional_param('files', '', PARAM_RAW); if(!$repository = $DB->get_record('repository', array('id'=>$id))) { echo json_encode('wrong'); @@ -35,6 +38,15 @@ if($action == 'list') { echo json_encode($repo->get_listing()); } +} elseif($action == 'download') { + $ret = array(); + foreach($files as $url) { + $ret[] = $repo->get_file($url); + // TODO + // Need to communicate with FILE API + // Copy the tmp file to final location + } + echo json_encode($ret); } else { echo json_encode($repo->print_login()); } -- 2.39.5