我需要每天從我的本地服務器下載http://www.carriersoftwaredata.com/Login.aspx?file=FHWA的CSV文件。我的計劃是執行一個運行php腳本的cron作業來執行此操作。但是,在允許下載文件之前,該頁面需要輸入用戶名和密碼。如果我在我的Web瀏覽器中訪問此頁面,請輸入用戶名和密碼,然後提交表單,然後我的瀏覽器會顯示一個Download對話框並開始下載該文件。如何使用PHP提交表單並從其他網站檢索文件?
如何使用PHP提交表單並下載提供的文件?
這是我目前正在做的,以獲得必要的$ _POST信息。
//url for fhwa db file
$fhwa_url = 'http://www.carriersoftwaredata.com/Login.aspx?file=FHWA';
//get the contents of the fhwa page
$fhwa_login = file_get_contents($fhwa_url);
//load contents of fhwa page into a DOMDocument object
$fhwa_dom = new DOMDocument;
if (!$fhwa_dom->loadhtml($fhwa_login))
{
echo 'Could not Load html for FHWA Login page.';
}
else
{
//create a post array to send back to the server - keys relate to the name of the input
$fhwa_post_items = array(
'__VIEWSTATE'=>'',
'Email'=>'',
'Password'=>'',
'__EVENTVALIDATION'=>'',
);
//create an xpath object
$xpath = new DOMXpath($fhwa_dom);
//iterate through the form1 form and find all inputs
foreach($xpath->query('//form[@name="form1"]//input') as $input)
{
//get name and value of input
$input_name = $input->getAttribute('name');
$input_value = $input->getAttribute('value');
//check if input name matches a key in the post array
if(array_key_exists($input_name, $fhwa_post_items))
{
//if the input name is Email or Password enter the defined email and password
switch($input_name)
{
case 'Email':
$input_value = $email;
break;
case 'Password':
$input_value = $pass;
break;
}//switch
//assign value to post array
$fhwa_post[$input_name] = $input_value;
}// if
}// foreach
}// if
這就是我如何提交表單 - 但它似乎並沒有以我需要的方式工作。我希望stream_get_contents返回的內容是我想要下載的CSV文件的內容。
//get the url data and open a connection to the page
$url_data = parse_url($fhwa_url);
$post_str = http_build_query($fhwa_post);
//create socket
$fp = @fsockopen($url_data['host'], 80, $errno, $errstr, 30);
fputs($fp, "POST $fhwa_url HTTP/1.0\r\n");
fputs($fp, "Host: {$url_data['host']}\r\n");
fputs($fp, "User-Agent: Mozilla/4.5 [en]\r\n");
fputs($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-Length: ".strlen($post_str)."\r\n");
fputs($fp, "\r\n");
fputs($fp, $post_str."\r\n\r\n");
echo stream_get_contents($fp);
fclose($fp);
任何幫助是絕對讚賞。
喜克里斯 - 感謝您的幫助。我發現了一個不同的解決方案,無需使用cURL,但是如果我需要做類似的事情,肯定會看到這個。感謝您向我展示如何通過cURL發送帖子字段。 – jeremysawesome 2010-11-09 17:57:29