2011-05-30 143 views
5

如果頭文件設置爲true,我如何使用Curl下載PHP中的文件?我也可以得到文件的文件名和擴展名?如何使用curl在php下載文件?

示例PHP代碼:

curl_setopt ($ch, CURLOPT_HEADER, 1); 
$fp = fopen($strFilePath, 'w'); 
curl_setopt($ch, CURLOPT_FILE, $fp); 
+0

爲你做這些工作的答案?如果是,那麼請最有用,因爲他人的幫助是正確的。 – 2011-05-31 04:16:10

回答

4

下載文件或網頁使用PHP捲曲並保存到文件

<?php 
/** 
* Initialize the cURL session 
*/ 
$ch = curl_init(); 
/** 
* Set the URL of the page or file to download. 
*/ 
curl_setopt($ch, CURLOPT_URL, 
'http://news.google.com/news?hl=en&topic=t&output=rss'); 
/** 
* Create a new file 
*/ 
$fp = fopen('rss.xml', 'w'); 
/** 
* Ask cURL to write the contents to a file 
*/ 
curl_setopt($ch, CURLOPT_FILE, $fp); 
/** 
* Execute the cURL session 
*/ 
curl_exec ($ch); 
/** 
* Close cURL session and file 
*/ 
curl_close ($ch); 
fclose($fp); 
?> 
0

要同時獲得頭和數據分開,通常使用兩種標題回調和正文回調。就像在這個例子中一樣:http://curl.haxx.se/libcurl/php/examples/callbacks.html

要從頭文件獲取文件名,您需要檢查Content-Disposition:頭並從那裏提取文件名(如果存在)或者只使用文件名部分網址或類似網址。你的選擇。

2

下面是一個使用類的完整示例。標題解析更精細,然後它可以,因爲我奠定了完整的層次結構標題存儲的基礎。

我剛剛注意到init()應該重置更多的變量,如果它希望可以重用實例更多的URL,但這應該至少爲您提供了一個如何將文件下載到由服務器。

<?php 
/* 
* vim: ts=4 sw=4 fdm=marker noet tw=78 
*/ 
class curlDownloader 
{ 
    private $remoteFileName = NULL; 
    private $ch = NULL; 
    private $headers = array(); 
    private $response = NULL; 
    private $fp = NULL; 
    private $debug = FALSE; 
    private $fileSize = 0; 

    const DEFAULT_FNAME = 'remote.out'; 

    public function __construct($url) 
    { 
     $this->init($url); 
    } 

    public function toggleDebug() 
    { 
     $this->debug = !$this->debug; 
    } 

    public function init($url) 
    { 
     if(!$url) 
      throw new InvalidArgumentException("Need a URL"); 

     $this->ch = curl_init(); 
     curl_setopt($this->ch, CURLOPT_URL, $url); 
     curl_setopt($this->ch, CURLOPT_HEADERFUNCTION, 
      array($this, 'headerCallback')); 
     curl_setopt($this->ch, CURLOPT_WRITEFUNCTION, 
      array($this, 'bodyCallback')); 
    } 

    public function headerCallback($ch, $string) 
    { 
     $len = strlen($string); 
     if(!strstr($string, ':')) 
     { 
      $this->response = trim($string); 
      return $len; 
     } 
     list($name, $value) = explode(':', $string, 2); 
     if(strcasecmp($name, 'Content-Disposition') == 0) 
     { 
      $parts = explode(';', $value); 
      if(count($parts) > 1) 
      { 
       foreach($parts AS $crumb) 
       { 
        if(strstr($crumb, '=')) 
        { 
         list($pname, $pval) = explode('=', $crumb); 
         $pname = trim($pname); 
         if(strcasecmp($pname, 'filename') == 0) 
         { 
          // Using basename to prevent path injection 
          // in malicious headers. 
          $this->remoteFileName = basename(
           $this->unquote(trim($pval))); 
          $this->fp = fopen($this->remoteFileName, 'wb'); 
         } 
        } 
       } 
      } 
     } 

     $this->headers[$name] = trim($value); 
     return $len; 
    } 
    public function bodyCallback($ch, $string) 
    { 
     if(!$this->fp) 
     { 
      trigger_error("No remote filename received, trying default", 
       E_USER_WARNING); 
      $this->remoteFileName = self::DEFAULT_FNAME; 
      $this->fp = fopen($this->remoteFileName, 'wb'); 
      if(!$this->fp) 
       throw new RuntimeException("Can't open default filename"); 
     } 
     $len = fwrite($this->fp, $string); 
     $this->fileSize += $len; 
     return $len; 
    } 

    public function download() 
    { 
     $retval = curl_exec($this->ch); 
     if($this->debug) 
      var_dump($this->headers); 
     fclose($this->fp); 
     curl_close($this->ch); 
     return $this->fileSize; 
    } 

    public function getFileName() { return $this->remoteFileName; } 

    private function unquote($string) 
    { 
     return str_replace(array("'", '"'), '', $string); 
    } 
} 

$dl = new curlDownloader(
    'https://dl.example.org/torrent/cool-movie/4358-hash/download.torrent' 
); 
$size = $dl->download(); 
printf("Downloaded %u bytes to %s\n", $size, $dl->getFileName()); 
?> 
1

我相信你現在已經找到了你的答案。然而,我想分享我的腳本,通過發送一個json請求到一個服務器返回二進制文件,然後它即時下載。保存是沒有必要的。希望能幫助到你!

注意:您可以避免將發佈數據轉換爲json。

<?php 

// Username or E-mail 
$login = 'username'; 
// Password 
$password = 'password'; 
// API Request 
$url = 'https://example.com/api'; 
// POST data 
$data = array('someTask', 24); 
// Convert POST data to json 
$data_string = json_encode($data); 
// initialize cURL 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url); 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password"); 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

// Execute cURL and store the response in a variable 
$file = curl_exec($ch); 

// Get the Header Size 
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); 
// Get the Header from response 
$header = substr($file, 0, $header_size); 
// Get the Body from response 
$body = substr($file, $header_size); 
// Explode Header rows into an array 
$header_items = explode("\n", $header); 
// Close cURL handler 
curl_close($ch); 

// define new variable for the File name 
$file_name = null; 

// find the filname in the headers. 
if(!preg_match('/filename="(.*?)"/', $header, $matches)){ 
    // If filename not found do something... 
    echo "Unable to find filename.<br>Please check the Response Headers or Header parsing!"; 
    exit(); 
} else { 
    // If filename was found assign the name to the variable above 
    $file_name = $matches[1]; 
} 
// Check header response, if HTTP response is not 200, then display the error. 
if(!preg_match('/200/', $header_items[0])){ 
    echo '<pre>'.print_r($header_items[0], true).'</pre>'; 
    exit(); 
} else { 
    // Check header response, if HTTP response is 200, then proceed further. 

    // Set the header for PHP to tell it, we would like to download a file 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Disposition: attachment; filename='.$file_name); 

    // Echo out the file, which then should trigger the download 
    echo $file; 
    exit; 
} 

?>