2016-01-31 1 views
3

Я пытался загрузить файл с API в 2 иным образом без какого-либо успеха: https://example.com/export/banana/by_date/v4?api_token=666&from=$today&to=$todayЗагрузка файла CSV с помощью PHP из API - с URL, который не заканчивается .csv

* Уведомление файл не заканчивается .csv, он просто выталкивает файл файла.

Файл, который загружается, является файлом .CSV.

Я попытался с помощью CURL:

// Date looks like this: 2016-01-31  
$today = date("Y-m-d"); 

    $output_filename = "test.csv"; 

    $host = "https://example.com/export/banana/by_date/v4?api_token=666&from=$today&to=$today"; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $host); 
    curl_setopt($ch, CURLOPT_VERBOSE, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_AUTOREFERER, false); 
    curl_setopt($ch, CURLOPT_REFERER, "https://www.example.com"); 
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    $result = curl_exec($ch); 
    curl_close($ch); 

    print_r($result); // prints the contents of the collected file before writing.. 


    // the following lines write the contents to a file in the same directory (provided permissions etc) 
    $fp = fopen($output_filename, 'w'); 
    fwrite($fp, $result); 
    fclose($fp); 
  • С помощью этого кода я получил черный test.csv файл.
  • Я ничего напечатанное на экране не получить после выполнения функции (print_r($result))

и я попытался с помощью file_put_contents функции:

$today = date("Y-m-d"); 
echo $today; 
file_put_contents("", fopen("https://example.com/export/banana/by_date/v4?api_token=666&from=$today&to=$today", 'r')); 
// I TRIED THIS ONE TOO: 
// file_put_contents("temp.csv", "https://example.com/export/banana/by_date/v4?api_token=666&from=$today&to=$today"); 

* Я получаю CSV файл с URL внутри это в первом ряду (https://example.com/export/banana/by_date/v4?api_token=666&from=2016-01-31&to=2016-01-31).

Может кто-нибудь помочь мне, сказав мне, правильно ли я это делаю? (поскольку это не прямая ссылка на файл, возможно, я работаю неправильно). И как правильно это сделать.

+0

так 'print_r ($ результатов)' показывает содержимое , но ничего не отображается в сохраненном файле? – RST

+0

Правильно ли работает 'print_r'? Если это так, это проблема PHP; в противном случае это проблема CURL. – BradzTech

+0

@RST да. Я получаю пустой CSV. –

ответ

1

Целевой URL является https поэтому, возможно, вам нужно добавить определенный Ssl конкретные варианты

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
curl_setopt($ch, CURLOPT_CAINFO, realpath('/path/to/cacert.pem')); 

еще одна распространенная причина из-за отсутствия зависающих запросов - отсутствие строки useragent.

curl_setopt($ch, CURLOPT_USERAGENT, 'my useragent string'); 

Вы можете установить аналогичные параметры при использовании file_get_contents путем установки опций для $context

На основе последнего комментария, добавьте:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); 
+0

Я не уверен, что есть: 'curl_setopt ($ ch, CURLOPT_CAINFO, realpath ('/path/to/cacert.pem'));' –

+0

Я добавил: 'curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, FALSE);' и 'curl_setopt ($ ch, CURLOPT_SSL_VERIFYHOST, 2);' и я получаю: и получаю 'Ресурс был найден по адресу https://example.com/export/banana/by_date/v4?api_token=666&from=$today&to= $ today_KJAGS; вы должны быть перенаправлены автоматически. ' ' _KJAGS' в конце URL-адреса добавляется и изменяет строку каждый раз, когда я обновляю страницу. –

+0

вы можете скачать 'cacert.pem' из interwebs - легко найти. Это набор сертификатов для задач проверки. 'Realpath()' - замените путь фактическим путём файла в вашей системе, если вы намереваетесь его использовать. – RamRaider

0

Это хорошо известная (для меня) проблема с доступом к ресурсам https с помощью cURL из php - она ​​не может проверить сертификат в конфигурации по умолчанию. Так проще всего получить этот скрипт работает, вы должны добавить две дополнительные линии для curl_config:

$today = date("Y-m-d"); 

$output_filename = "test.csv"; 

$host = "https://example.com/export/banana/by_date/v4?api_token=666&from=$today&to=$today"; 
$ch = curl_init(); 
$curl_config = [ 
    CURLOPT_URL => $host, 
    CURLOPT_VERBOSE => 1, 
    CURLOPT_RETURNTRANSFER => 1, 
    CURLOPT_AUTOREFERER => false, 
    CURLOPT_REFERER => "https://www.example.com", 
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, 
    CURLOPT_HEADER => 0, 
    CURLOPT_SSL_VERIFYHOST => 0, //do not verify that host matches one in certifica 
    CURLOPT_SSL_VERIFYPEER => 0, //do not verify certificate's meta 
]; 

curl_setopt_array($ch, $curl_config); //apply config 

$result = curl_exec($ch); 

if (empty($result)){ 
    echo curl_error($ch); //show possible error if answer if empty and exit script 
    exit; 
} 

curl_close($ch); 

print_r($result); // prints the contents of the collected file before writing.. 

// the following lines write the contents to a file in the same directory (provided permissions etc) 
file_put_contents($output_filename, $result); 
+0

две дополнительные строки: 'CURLOPT_SSL_VERIFYHOST' и' CURLOPT_SSL_VERIFYPEER'? Я прав? –

+0

Да. Я скорректировал ответ, добавляя строку, где применяется config. –