2014-02-07 6 views
0

Я пытаюсь реализовать простой FTP-клиент foldergrid. Я использую простой клиент php из документации foldergrid api. Клиентский код, который я получил от документации АФИ:foldergrid php client получить информацию о папке

class FolderGridClient { 
    protected $_cookieFileLocation = './cookie.txt'; 
    public $_webpage; 
    public $_status; 
    public $_location; 

    const SERVER_HOST = 'https://secure.foldergrid.com'; 

    public function authenticate($username,$password, $domain){ 
     $params = array("domain"=>$domain,"username"=>$username,"password"=>$password); 
     $this->createCurl(self::SERVER_HOST."/login",$params); 
    } 
    public function createDomain($adminemail,$adminpassword, $domainname, $adminfname, $adminlname){ 
     $json = json_encode(array('invite'=>true, 'admin' => array('email'=>$adminemail,'password'=>$adminpassword,'firstname'=>$adminfname,'lastname'=>$adminlname))); 
     $this->createCurl(self::SERVER_HOST."/domain/".$domainname,$json,true); 
    } 
    public function uploadFile($file,$name,$parentDuid) { 
     $fh = fopen($file, "rb"); 
     if($fh) { 
      $json = json_encode(array('parentDuid'=>$parentDuid, 'name' => $name, 'parts' => 1)); 
      $this->createCurl(self::SERVER_HOST."/file/provision",$json,true); 

      if($this->_location){ 
       $headers = array(
         'fg-eap: false', 
         'fg-md5:'.md5_file($file), 
         'Content-Type: binary/octet-stream' 
       ); 

       $curl = curl_init(); 

       curl_setopt($curl,CURLOPT_PUT,true); 
       curl_setopt($curl, CURLOPT_HEADER, TRUE); 
       curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
       curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); 
       curl_setopt($curl, CURLOPT_URL, $this->_location); 
       curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); 
       curl_setopt($curl, CURLOPT_BINARYTRANSFER, true); 
       curl_setopt($curl, CURLOPT_INFILE, $fh); 
       curl_setopt($curl, CURLOPT_INFILESIZE, filesize($file)); 
       curl_setopt($curl, CURLOPT_VERBOSE, true); 

       $this->_webpage = curl_exec($curl); 
       $this->_status = curl_getinfo($curl,CURLINFO_HTTP_CODE); 
       fclose($fh); 
       curl_close($curl); 
      } 
     }else{ 
      echo "File not found: $file \n"; 
     } 
    } 
    public function fetchFolder($pathOrDuid){ 
     $this->createCurl(self::SERVER_HOST."/folder/$pathOrDuid"); 
     return $this->_webpage; 
    } 
    public function fetchFile($fileid){ 
     $this->createCurl(self::SERVER_HOST."/file/$fileid"); 
     return $this->_webpage; 
    } 

    public function createCurl($url,$postFields = null, $put = false) 
    { 
     $s = curl_init(); 

     curl_setopt($s, CURLOPT_VERBOSE, true); 
     curl_setopt($s,CURLOPT_URL,$url); 
     curl_setopt($s,CURLOPT_RETURNTRANSFER,true); 
     curl_setopt($s, CURLOPT_HEADER, TRUE); 
     curl_setopt($s,CURLOPT_FOLLOWLOCATION,false); 
     curl_setopt($s,CURLOPT_COOKIEJAR,$this->_cookieFileLocation); 
     curl_setopt($s,CURLOPT_COOKIEFILE,$this->_cookieFileLocation); 

     if($postFields) 
     { 
      curl_setopt($s,CURLOPT_POST,true); 
      if($put) { 
       curl_setopt($s, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Content-Length: ' . strlen($postFields))); 
       curl_setopt($s,CURLOPT_CUSTOMREQUEST, "PUT"); 
      }else{ 
       curl_setopt($s, CURLOPT_HTTPHEADER, array('Expect:')); 
      } 
      curl_setopt($s,CURLOPT_POSTFIELDS,$postFields); 
     } 
     $this->_webpage = curl_exec($s); 
     $this->_status = curl_getinfo($s,CURLINFO_HTTP_CODE); 
     preg_match_all('/^Location:(.*)$/mi', $this->_webpage, $matches); 
     $this->_location = !empty($matches[1]) ? trim($matches[1][0]) : null; 
     curl_close($s); 
    } 

} 

С помощью этого клиента, я был в состоянии успешно загрузить файл в мой каталог корневой сетки папки. Теперь я создал тестовую папку под корнем, и я пытаюсь использовать API для получения верной папки. Я использовал следующий код:

$uname='myuname'; 
$pwd='mypwd'; 
$domain='mydomain'; 
$rootDUID='duidOFRootFolder'; 

$client = new FolderGridClient; 
$client->authenticate($uname,$pwd,$domain); 
if($client->_status < 400){ 
    echo "fetchFolder: " . $client->fetchFolder($domain.'/TestNewFolder') . "<BR>"; 
} 

TestNewFolder это имя папки, которую я создал с помощью foldergrid Javascript ссылка клиента на https://mydomain.foldergrid.com/show/ * .html

Корень имя_папки такой же, как моего доменного имени, которое я думаю, стандарт для папки.

Однако, когда я запускаю этот код, я всегда получаю сообщение, не найденное в папке. Я пробовал различные разные перестановки пути к папке как вход в функцию fetchFolder без успеха. поэтому два вопроса: 1. Как использовать функцию fetchFolder в простом клиенте php, чтобы получить информацию о папке - в частности, дуд. 2. Есть ли у кого-нибудь дополнение к простому клиенту php для создания подпапки, как только я обнаружил, что у вас есть целевая папка?

БЛАГОДАРЯ

ответ

0

Когда вы create a new folder programmatically using the FolderGrid API присвоить неизменность DUID, который однозначно идентифицирует эту папку. Один простой способ определить DUID для любой существующей папки - просто открыть веб-приложение FolderGrid и щелкнуть правой кнопкой мыши по папке, чтобы выбрать «Show Info».

Чтобы определить неизвестный DUID программно с помощью вызовов API, вы просто проходите путь к папке из более высокой папки с известным DUID, используя вызовы Show Folder Details, которые отображают DUID всех подпапок. Например, вы должны выполнить GET/папку/DUID в своей корневой папке, которая вернет (среди прочего) json-массив имен и DUID всех подпапок корневой папки, включая TestNewFolder

Один полезный ярлык упоминается в документах API для Show Folder Details, который заключается в том, что вы можете заменить звездочку '*' для DUID в этом вызове как сокращенную ссылку на корневую папку.

Образец кода клиента PHP использует имя «pathOrDuid» для параметра fetchFolder, но это вводит в заблуждение, поскольку вызов для извлечения folder's details by path is a distinct call as documented here.

0

Итак, следующие предложения Simmerman, вот какой-то php-код, который я использовал для получения дубликата подпапки, если я знаю родительские папки duid (например, «*» для корневой папки). Я добавил следующую функцию в PHP простого клиента, который foldergrid предоставленный в их документации:

public function getSubFolderDuid($parentDuid,$folderName) { 
    $fetchParent = $this->fetchFolder($parentDuid); 

    $parentJsonMatch = array(); 
    preg_match("/\{.*\}/",$fetchParent,&$parentJsonMatch); 
    $returnArray=true; 
    $parentJsonArray = json_decode($parentJsonMatch[0],$returnArray); 
    $subFolders = $parentJsonArray['folders']; 

    foreach($subFolders as $folderData) { 
    if ($folderData['name'] == $folderName) return $folderData['duid']; 
    } 

    return ''; 

} 

очевидно есть много места, чтобы добавить обработку ошибок в этой функцию в случае, если родительская папка не возвращается. Эта функция предполагает, что родительская папка существует и возвращается как данные json.

Вот код, который я использовал для вызова функции:

if($client->_status < 400){ 
     $parentDuid = '*'; 
     $folderName = 'TestNewFolder'; 
     $folderDuid = $client->getSubFolderDuid($parentDuid,$folderName); 

     echo "$folderName: $folderDuid<br>"; 
    } 

С помощью этих строительных блоков теперь я могу построить код для обхода дерева каталогов или найти конкретную DUID папку на произвольной глубине в дереве.

Спасибо, что указал мне в правильном направлении Simmerman

Смежные вопросы