2013-05-24 2 views
0

У меня довольно сложный вопрос. Я хочу загрузить файлы из Dropbox, используя класс DropPHP. К сожалению, моя общая среда размещения не может записывать файлы на веб-сервере. Единственный вариант - это использование папки tmp или базы данных.Dropbox api to tmp files

Поскольку DropPHP использует пользовательскую функцию DownloadFile() для загрузки файла на веб-сервер, мне нужно изменить функцию, чтобы она записывалась в папку tmp. Как это сделать?? Я не знаком с ТМП еще ...

Функция заключается в следующем:

public function DownloadFile($dropbox_file, $dest_path='', $rev=null, $progress_changed_callback = null) 
    { 
     if(is_object($dropbox_file) && !empty($dropbox_file->path)) 
      $dropbox_file = $dropbox_file->path; 

     if(empty($dest_path)) $dest_path = basename($dropbox_file); 

     $url = $this->cleanUrl(self::API_CONTENT_URL."/files/$this->rootPath/$dropbox_file"); 
     $content = (!empty($rev)) ? http_build_query(array('rev' => $rev),'','&') : null; 
     $context = $this->createRequestContext($url, "GET", $content); 

     $fh = @fopen($dest_path, 'wb'); // write binary 
     if($fh === false) { 
      @fclose($rh); 
      throw new DropboxException("Could not create file $dest_path !"); 
     } 

     if($this->useCurl) { 
      curl_setopt($context, CURLOPT_BINARYTRANSFER, true); 
      curl_setopt($context, CURLOPT_RETURNTRANSFER, true); 
      curl_setopt($context, CURLOPT_FILE, $fh); 
      $response_headers = array(); 
      self::execCurlAndClose($context, $response_headers); 
      fclose($fh); 
      $meta = self::getMetaFromHeaders($response_headers); 
      $bytes_loaded = filesize($dest_path); 
     } else { 
      $rh = @fopen($url, 'rb', false, $context); // read binary 
      if($rh === false) 
       throw new DropboxException("HTTP request to $url failed!"); 



      // get file meta from HTTP header 
      $s_meta = stream_get_meta_data($rh); 
      $meta = self::getMetaFromHeaders($s_meta['wrapper_data']); 
      $bytes_loaded = 0; 
      while (!feof($rh)) { 
       if(($s=fwrite($fh, fread($rh, self::BUFFER_SIZE))) === false) { 
       @fclose($rh); 
       @fclose($fh); 
       throw new DropboxException("Writing to file $dest_path failed!'"); 
       } 
       $bytes_loaded += $s; 
       if(!empty($progress_changed_callback)) { 
       call_user_func($progress_changed_callback, $bytes_loaded, $meta->bytes); 
       } 
      } 

      fclose($rh); 
      fclose($fh); 
     } 

     if($meta->bytes != $bytes_loaded) 
      throw new DropboxException("Download size mismatch!"); 

     return $meta; 
    } 

ответ

0

Нашел! Это была следующая строка мне пришлось изменить:

curl_setopt($context, CURLOPT_FILE, $fh); 

Если удалить его, файл возвращается в виде бинарной строки, если я это сделать: заменить этот

self::execCurlAndClose($context, $response_headers); 

этим

$thefilebinarystring = self::execCurlAndClose($context, $response_headers); 

Или, если я хочу писать в файл tmp, не удаляйте строку, указанную выше, но замените $ fh на файл temp, который вы создаете ранее, с помощью $ temp = tmp file()

Однако, я еще не обновил остальную часть кода, но это ядро!

Спасибо за отличный ответ, я сам! ;)