[英]Why can't I generate Excel file through cURL/PHP?
在選擇要從MySQL數據庫中獲取哪些數據后,我嘗試使用發布表單來生成Excel文件。 我之所以使用cURL,是因為我本質上是想重復發布:首先保存使用哪個字段的所有設置,然后保存生成Excel文件的全部操作,只需一個按鈕即可。
我有一個設置有正確標頭的PHP頁面,用於從制表符分隔的內容生成一個簡單的Excel文件(不處理行尾或字段中的制表符,只是保持簡單)。 如果我直接使用瀏覽器訪問該頁面(並在PHP中包含虛擬數據),則我的瀏覽器將下載Excel文件。
我正在通過cURL發布(如果我不通過cURL-- ??發送標題)將數據傳遞到此頁面。
這是關於我迷路的地方:
如何通過cURL將數據創建/下載為Excel文件?
我猜這是帶標題的事情嗎?
在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
似乎是一個線索。 但是最初的研究沒有幫助我,部分原因是因為我迷路了。
有任何想法嗎?
謝謝!
-傑里米
好吧,我相信CURLOPT_HTTPHEADER
為請求設置標題,而不是響應。 至於$_POST
去,你是什么意思它不起作用? 您是否為發布請求設置了CURLOPT
(默認為get)?
我認為您從根本上誤解了內容交付的方式。 內容類型標題只是指出了期望的格式,但是您仍然必須實際生成該格式的數據。
查看Excel文件格式,這不是一件容易的事。 有一個基於PHP的類,該類使用COM編寫Excel文件(並且僅在Windows服務器上有效): 在這里,我自己並未使用過它。
然后是PHPExcel ,它使用了新的基於XML的Excel格式並獨立於平台工作。 我也不知道,但是看起來不錯。
請記住,始終有可能提供簡單的舊CSV並在Excel中打開它。 它為您提供了更少的選擇(沒有專欄設計等),但是無需任何庫或擴展即可立即使用。
另外,我不確定在這種情況下您想使用cURL嗎? 您沒有嘗試在服務器端下載任何內容,如果我理解正確的話,是嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.