Почему я не могу сгенерировать файл Excel через cURL / PHP? - PullRequest
0 голосов
/ 31 января 2010

Я пытаюсь использовать почтовую форму для создания файла Excel после выбора данных, которые нужно извлечь из базы данных MySQL. Я использую cURL, потому что по сути хочу сделать двойной пост: сначала сохранить все настройки используемых полей, а затем создать файл Excel, все с помощью одной кнопки.

У меня есть страница PHP, настроенная с правильными заголовками, чтобы генерировать простой файл Excel из содержимого, разделенного табуляцией (не имея дело с окончаниями строк или табуляциями в полях, просто сохраняя это простым). Если я попаду на эту страницу напрямую из браузера (и включу фиктивные данные в PHP), мой браузер загрузит файл Excel.

Я передаю данные на эту страницу через сообщение cURL (если я не отправляю заголовки через cURL - ??).

А вот где я заблудился:

Как мне создать / загрузить данные в виде файла Excel через cURL?

Полагаю, это что-то делать с заголовками?

Настройка заголовков в PHP работала довольно хорошо:

header("Content-Disposition: attachment; filename=\"$filename\"");
header("Content-Type: application/vnd.ms-excel; charset=UTF-8");
header("Pragma: public");
header("Cache-control: max-age=0");

Когда я установил их через cURL, я сделал это (ну, это все мои варианты cURL):

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $foo);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Disposition: attachment; filename=test.xls',
    'Content-Type: application/vnd.ms-excel; charset=UTF-8',
    'Pragma: public',
    'Cache-control: max-age=0'
));
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$response_code = curl_exec($ch);
if ($response_code!== false) {
    echo 'response: '.$response_code;
} else {
    echo 'error: '.curl_error($ch);
}
curl_close ($ch);           

Когда я делаю это, код cURL $ response_code, который я получаю на странице отправки, выглядит следующим образом (я разбил строки - все это одна строка):

HTTP/1.1 200 OK 
Date: Sun, 31 Jan 2010 20:43:38 GMT 
Server: Apache 
Transfer-Encoding: chunked 
Content-Type: text/html

Когда я не включаю заголовки через cURL, работает $ _POST. Но когда я включаю заголовки, $ _POST не работает.

Это Transfer-Encoding: chunked похоже на ключ. Но первоначальные исследования мне не помогли, отчасти потому, что, как я уже говорил, я потерялся.

Есть идеи?

Спасибо!
-Jeremy

Ответы [ 2 ]

0 голосов
/ 31 января 2010

Я думаю, вы в корне ошибаетесь в способе доставки контента. Заголовки типа содержимого просто указывают, какой формат ожидать, но вам все равно нужно на самом деле генерировать данных в этом формате.

Глядя на формат файла Excel, это не тривиальная задача. Существует класс на основе PHP, который использует COM для записи файла Excel (и работает только на сервере Windows): здесь Хотя я сам не использовал его.

Тогда есть PHPExcel , который использует новый формат Excel на основе XML и работает независимо от платформы. Я тоже этого не знаю, но выглядит хорошо.

Помните, что всегда есть возможность поставить старый CSV и открыть его в Excel. Он оставляет вам гораздо меньше возможностей (без дизайна колонок и т. Д.), Но будет работать без каких-либо библиотек или расширений.

Кроме того, я не уверен, для чего вы хотите использовать cURL в этом сценарии? Вы не пытаетесь загрузить что-либо на стороне сервера, если я правильно понимаю, вы?

0 голосов
/ 31 января 2010

Ну, я верю CURLOPT_HTTPHEADER устанавливает заголовки для запроса ... не ответа. Что касается $_POST, что вы имеете в виду, что он не работает? Вы установили CURLOPT для пост-запроса (по умолчанию get)?

...