如果頭文件設置爲true,我如何使用Curl下載PHP中的文件?我也可以得到文件的文件名和擴展名?如何使用curl在php下載文件?
示例PHP代碼:
curl_setopt ($ch, CURLOPT_HEADER, 1);
$fp = fopen($strFilePath, 'w');
curl_setopt($ch, CURLOPT_FILE, $fp);
如果頭文件設置爲true,我如何使用Curl下載PHP中的文件?我也可以得到文件的文件名和擴展名?如何使用curl在php下載文件?
示例PHP代碼:
curl_setopt ($ch, CURLOPT_HEADER, 1);
$fp = fopen($strFilePath, 'w');
curl_setopt($ch, CURLOPT_FILE, $fp);
下載文件或網頁使用PHP捲曲並保存到文件
<?php
/**
* Initialize the cURL session
*/
$ch = curl_init();
/**
* Set the URL of the page or file to download.
*/
curl_setopt($ch, CURLOPT_URL,
'http://news.google.com/news?hl=en&topic=t&output=rss');
/**
* Create a new file
*/
$fp = fopen('rss.xml', 'w');
/**
* Ask cURL to write the contents to a file
*/
curl_setopt($ch, CURLOPT_FILE, $fp);
/**
* Execute the cURL session
*/
curl_exec ($ch);
/**
* Close cURL session and file
*/
curl_close ($ch);
fclose($fp);
?>
要同時獲得頭和數據分開,通常使用兩種標題回調和正文回調。就像在這個例子中一樣:http://curl.haxx.se/libcurl/php/examples/callbacks.html
要從頭文件獲取文件名,您需要檢查Content-Disposition:頭並從那裏提取文件名(如果存在)或者只使用文件名部分網址或類似網址。你的選擇。
下面是一個使用類的完整示例。標題解析更精細,然後它可以,因爲我奠定了完整的層次結構標題存儲的基礎。
我剛剛注意到init()應該重置更多的變量,如果它希望可以重用實例更多的URL,但這應該至少爲您提供了一個如何將文件下載到由服務器。
<?php
/*
* vim: ts=4 sw=4 fdm=marker noet tw=78
*/
class curlDownloader
{
private $remoteFileName = NULL;
private $ch = NULL;
private $headers = array();
private $response = NULL;
private $fp = NULL;
private $debug = FALSE;
private $fileSize = 0;
const DEFAULT_FNAME = 'remote.out';
public function __construct($url)
{
$this->init($url);
}
public function toggleDebug()
{
$this->debug = !$this->debug;
}
public function init($url)
{
if(!$url)
throw new InvalidArgumentException("Need a URL");
$this->ch = curl_init();
curl_setopt($this->ch, CURLOPT_URL, $url);
curl_setopt($this->ch, CURLOPT_HEADERFUNCTION,
array($this, 'headerCallback'));
curl_setopt($this->ch, CURLOPT_WRITEFUNCTION,
array($this, 'bodyCallback'));
}
public function headerCallback($ch, $string)
{
$len = strlen($string);
if(!strstr($string, ':'))
{
$this->response = trim($string);
return $len;
}
list($name, $value) = explode(':', $string, 2);
if(strcasecmp($name, 'Content-Disposition') == 0)
{
$parts = explode(';', $value);
if(count($parts) > 1)
{
foreach($parts AS $crumb)
{
if(strstr($crumb, '='))
{
list($pname, $pval) = explode('=', $crumb);
$pname = trim($pname);
if(strcasecmp($pname, 'filename') == 0)
{
// Using basename to prevent path injection
// in malicious headers.
$this->remoteFileName = basename(
$this->unquote(trim($pval)));
$this->fp = fopen($this->remoteFileName, 'wb');
}
}
}
}
}
$this->headers[$name] = trim($value);
return $len;
}
public function bodyCallback($ch, $string)
{
if(!$this->fp)
{
trigger_error("No remote filename received, trying default",
E_USER_WARNING);
$this->remoteFileName = self::DEFAULT_FNAME;
$this->fp = fopen($this->remoteFileName, 'wb');
if(!$this->fp)
throw new RuntimeException("Can't open default filename");
}
$len = fwrite($this->fp, $string);
$this->fileSize += $len;
return $len;
}
public function download()
{
$retval = curl_exec($this->ch);
if($this->debug)
var_dump($this->headers);
fclose($this->fp);
curl_close($this->ch);
return $this->fileSize;
}
public function getFileName() { return $this->remoteFileName; }
private function unquote($string)
{
return str_replace(array("'", '"'), '', $string);
}
}
$dl = new curlDownloader(
'https://dl.example.org/torrent/cool-movie/4358-hash/download.torrent'
);
$size = $dl->download();
printf("Downloaded %u bytes to %s\n", $size, $dl->getFileName());
?>
我相信你現在已經找到了你的答案。然而,我想分享我的腳本,通過發送一個json請求到一個服務器返回二進制文件,然後它即時下載。保存是沒有必要的。希望能幫助到你!
注意:您可以避免將發佈數據轉換爲json。
<?php
// Username or E-mail
$login = 'username';
// Password
$password = 'password';
// API Request
$url = 'https://example.com/api';
// POST data
$data = array('someTask', 24);
// Convert POST data to json
$data_string = json_encode($data);
// initialize cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// Execute cURL and store the response in a variable
$file = curl_exec($ch);
// Get the Header Size
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
// Get the Header from response
$header = substr($file, 0, $header_size);
// Get the Body from response
$body = substr($file, $header_size);
// Explode Header rows into an array
$header_items = explode("\n", $header);
// Close cURL handler
curl_close($ch);
// define new variable for the File name
$file_name = null;
// find the filname in the headers.
if(!preg_match('/filename="(.*?)"/', $header, $matches)){
// If filename not found do something...
echo "Unable to find filename.<br>Please check the Response Headers or Header parsing!";
exit();
} else {
// If filename was found assign the name to the variable above
$file_name = $matches[1];
}
// Check header response, if HTTP response is not 200, then display the error.
if(!preg_match('/200/', $header_items[0])){
echo '<pre>'.print_r($header_items[0], true).'</pre>';
exit();
} else {
// Check header response, if HTTP response is 200, then proceed further.
// Set the header for PHP to tell it, we would like to download a file
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Disposition: attachment; filename='.$file_name);
// Echo out the file, which then should trigger the download
echo $file;
exit;
}
?>
爲你做這些工作的答案?如果是,那麼請最有用,因爲他人的幫助是正確的。 – 2011-05-31 04:16:10