2015-12-11 110 views
0

我目前的目標是編寫一個函數,允許我使用API​​從Dropbox服務器返回文件的元數據。雖然我能夠上傳文件並創建列表,但我無法下載。 流程如下:
1.)用戶單擊文件,該文件將window.location調用到文件路徑
2.)這會調用具有下載路徑的dbDownloadFile。
3.)依次調用dropbox客戶端並使用dropbox getFile方法。

下載文件Dropbox服務器

我用php://輸出創建了一個流,希望dropbox客戶端可以在那裏寫文件,但是它會在這個過程中產生一些奇怪的問題。首先,我可能只會得到部分文件下載或文件可能已損壞。在我試圖下載的html文件的情況下,它根本不起作用,因爲我下載的文件沒有完全傳輸,並且總是以一個類似'string(7)「getfile」'和其他問題的字符串結尾。這是如何創建這個文件流的問題?謝謝。

dropbox_text.php

window.location="download.php?filepath="+r[0]; //r[0] is the path 

的download.php

$dbcon->dbDownloadFile($download_path); 

Controller.php這樣

public function dbDownloadFile($filepath) { 

      $path_parts = pathinfo($filepath); 
      $extension = $path_parts['extension']; 
      $filename = $path_parts['filename'].'.'.$extension; 

      $at = $this->getAuthToken(); 
      $dbxClient = $this->createDropboxClient($at); 
      header('Content-Description: File Transfer'); 
      header('Content-Type: application/octet-stream'); 
      header('Content-Disposition: attachment; filename="'.$filename.'"'); 
      header('Expires: 0'); 
      header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
      header('Pragma: public'); 

      $f = fopen('php://output', "w"); 
      //$f = tmpfile(); 
      $metaData = $dbxClient->getFile($filepath, $f); 
      ob_clean(); 
      flush(); 
      sleep(1); 
      fclose($f); 
      //return $f; 
    } 

回答

0
public function dbDownloadFile($filepath) { 

      $path_parts = pathinfo($filepath); 
      $extension = $path_parts['extension']; 
      $filename = $path_parts['filename'].'.'.$extension; 

      $at = $this->getAuthToken(); 
      $dbxClient = $this->createDropboxClient($at); 
      header('Content-Description: File Transfer'); 
      header('Content-Type: application/octet-stream'); 
      header('Content-Disposition: attachment; filename="'.$filename.'"'); 
      header('Expires: 0'); 
      header('Pragma: public'); 

      $f = fopen('php://output', "w"); 
      $metaData = $dbxClient->getFile($filepath, $f); 
      flush(); 
      sleep(1); 
      fclose($f); 
    } 

我覺得緩存控制導致的問題。它在文件的頂部寫了一些字符串,導致它不能正確渲染。如果任何人都可以幫我澄清,因爲我不是一個很棒的專家。