2016-04-14 19 views
0

Ich benutze eine Funktion, um Dateien über eine private API herunterzuladen. Alles geht gut, um kleine/mittlere Dateien herunterzuladen, aber große Dateien sind unmöglich, weil sie zu viel Speicher verbraucht.CURL_RETURNTRANSFER Downloding große Dateien

Hier ist meine Funktion:

protected function executeFile($method, $url, $params=array(), $as_user=null) { 

    $data_string = json_encode($params); 
    $method = strtoupper($method); 

    $ch = curl_init(); 

    if($method == 'GET') { 
     $url = $this->options['api_url'].$url.'?'; 
     $url .= $this->format_query($params); 
     curl_setopt($ch, CURLOPT_URL, $url); 
    } else { 
     curl_setopt($ch, CURLOPT_URL, $this->options['api_url'].$url); 
    } 

    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

    if($as_user) { 
     curl_setopt($ch, CURLOPT_HTTPHEADER, array(
     'Content-Type: application/json', 
     'Content-Length: ' . strlen($data_string), 
     'Token: '.$this->token, 
     'As: '.$as_user 
     )); 
    } else { 
     curl_setopt($ch, CURLOPT_HTTPHEADER, array(
     'Content-Type: application/json', 
     'Content-Length: ' . strlen($data_string), 
     'Token: '.$this->token 
     )); 
    } 

    $result_json = curl_exec($ch); 
    $curl_info = curl_getinfo($ch); 


    $return    = array(); 
    $return["result"] = $result_json; 
    $return["entete"] = $curl_info; 
    return $return; 
} 

Wie konnte ich das optimieren Dateien auf die Festplatte statt Speicher zum Download?

Danke

+0

Diese Frage wurde hier schon beantwortet: http://stackoverflow.com/questions/6409462/downloading -a-large-file-using-curl –

Antwort

1

Verwenden Sie CURLOPT_FILE. Es wird nach einem Dateizeiger gefragt, wo der Download gespeichert wird.

Code wird wie

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$fp = fopen("your_file", 'w+'); 
curl_setopt($ch, CURLOPT_FILE, $fp); 

curl_exec ($ch); 
0

Sie CURLOPT_FILE verwenden können, wie folgt aus:

protected function executeFile($method, $url, $params=array(), $as_user=null) { 

    $data_string = json_encode($params); 
    $method = strtoupper($method); 
    $fp = fopen ('savefilepath', 'w+'); 

    $ch = curl_init(); 

    if($method == 'GET') { 
     $url = $this->options['api_url'].$url.'?'; 
     $url .= $this->format_query($params); 
     curl_setopt($ch, CURLOPT_URL, $url); 
    } else { 
     curl_setopt($ch, CURLOPT_URL, $this->options['api_url'].$url); 
    } 

    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_FILE, $fp); 

    .... 

    curl_exec($ch); 
    fclose($fp); 
    ..... 
    return $return; 
} 
+0

Ich habe dies versucht, aber Firefox sagt mir, dass "Quelldatei kann nicht gelesen werden" ... Aber Datei wird korrekt auf dem Server gespeichert! – TheMadCat

+0

Nur ein kurzer Snip-Code, möglicherweise müssen Sie die Datei nach dem Schreiben auf die Festplatte schließen: 'fclose ($ fp);'. Überprüfen Sie das Update auf den Speicherort des zusätzlichen Codes. –

+0

Ich habe das versucht, auch mit einem curl_close ($ ch); aber der gleiche Fehler und ich kann nicht verstehen warum ... Danke für Ihre Hilfe! – TheMadCat