2016-04-14 3 views
0

Я использую funtion для загрузки файлов через частный API. Все идет нормально, чтобы загружать небольшие/средние файлы, но большие файлы невозможно, потому что он использует слишком много памяти.CURL_RETURNTRANSFER downloding large files

Вот моя функция:

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

Как я мог оптимизировать это для загрузки файлов на диске, а не памяти?

Thanks

+0

Этот вопрос уже был дан ответ здесь: http://stackoverflow.com/questions/6409462/downloading -a-large-file-using-curl –

ответ

1

использовать CURLOPT_FILE. Он попросит указать указатель файла, в котором будет сохранена загрузка.

код будет как

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

curl_exec ($ch); 
0

Вы можете использовать CURLOPT_FILE, как это:

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

Я пробовал это, но Firefox говорит мне, что «Исходный файл не может быть прочитан» ... Но файл корректно сохраняется на диске на сервере! – TheMadCat

+0

Просто быстрый снип-код, возможно, вам нужно закрыть файл после записи на диск: 'fclose ($ fp);'. Проверьте обновление для местоположения дополнительного кода. –

+0

Я пробовал это, также включая curl_close ($ ch); но такая же ошибка, и я не могу понять, почему ... спасибо за вашу помощь! – TheMadCat