2013-05-24 4 views
0

J'ai une question assez difficile. Je veux télécharger des fichiers à partir de la boîte de dépôt, en utilisant la classe DropPHP. Malheureusement, mon environnement d'hébergement partagé ne peut pas écrire de fichiers sur le serveur Web. La seule option est l'utilisation du dossier tmp ou de la base de données.Dropbox API aux fichiers tmp

Étant donné que DropPHP utilise la fonction personnalisée DownloadFile() pour télécharger un fichier sur le serveur Web, je dois changer la fonction pour l'écrire dans le dossier tmp. Comment je fais ça?? Je ne suis pas au courant tmp encore ...

La fonction est la suivante:

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; 
    } 

Répondre

0

Je l'ai trouvé! Il était la ligne suivante, je devais changer:

curl_setopt($context, CURLOPT_FILE, $fh); 

Si je le supprimer, le fichier est retourné comme une chaîne binaire si je fais ceci: remplacer cette

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

par cette

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

Ou si je veux écrire dans un fichier tmp, ne supprimez pas la ligne ci-dessus, mais remplacez $ fh par le fichier $ temp que vous avez créé auparavant avec $ temp = tmp file()

Cependant, je n'ai pas encore mis à jour le reste du code, mais c'est le noyau!

Merci pour votre excellente réponse, moi-même! ;)