Php 如何使用cURL和OOP从服务器下载二进制响应文件?
我已经挣扎了一段时间,不知道我错过了什么 我编写了一个简单的类来使用cURL作为OOP。它可以很好地处理所有API请求,除了一个下载文件的请求 使用POST方法将请求以JSON格式发送到服务器。响应也以JSON的形式出现。下载API是唯一一个不以JSON响应,而是直接以二进制格式发送文件的API。这个似乎不适合我的小班 你能看一下我下面的代码并给我一些建议吗?非常感谢 curlClass.php->包含cURL方法的类文件Php 如何使用cURL和OOP从服务器下载二进制响应文件?,php,json,oop,curl,Php,Json,Oop,Curl,我已经挣扎了一段时间,不知道我错过了什么 我编写了一个简单的类来使用cURL作为OOP。它可以很好地处理所有API请求,除了一个下载文件的请求 使用POST方法将请求以JSON格式发送到服务器。响应也以JSON的形式出现。下载API是唯一一个不以JSON响应,而是直接以二进制格式发送文件的API。这个似乎不适合我的小班 你能看一下我下面的代码并给我一些建议吗?非常感谢 curlClass.php->包含cURL方法的类文件 <?php class curlClass { priv
<?php
class curlClass {
private $_cookie_jar;
public function login($email, $password, $url){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$email:$password");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$this->_cookie_jar = tempnam('folder','cookie_');
curl_setopt($ch, CURLOPT_COOKIEJAR, $this->_cookie_jar);
$_SESSION['cookieFile'] = $this->_cookie_jar;
$page = curl_exec($ch);
curl_close($ch);
return strlen($page);
}
public function postApi($post_data, $cookie_j, $url){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
//curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_j);
$page = curl_exec($ch);
curl_close($ch);
$json = json_decode($page);
return json_encode($json, JSON_PRETTY_PRINT);
}
public function downloadFile($post_data, $cookie_j, $url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_j);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
$response = curl_exec($ch);
// Then, after your curl_exec call:
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
curl_close($ch);
return json_encode($response, JSON_PRETTY_PRINT);
exit();
}
}
?>
php->这是我调用类及其函数的地方
<?php
require_once 'core/init.php';
$curl = new Curl();
if($curl->login('username', 'password', 'https://example.com/api' > 0){
$data = array('someRequest', 24);
$data_string = json_encode($data);
echo $curl->downloadFile($data_string, $_SESSION['cookieFile'], 'https://example.com/api');
}
?>
在downloadFile()
函数中,您有返回json\u encode($response,json\u PRETTY\u PRINT)代码>这似乎不正确
这将响应编码为一个字符串,如果您想使用它,则需要再次解码该字符串
似乎最合适的做法是从这个函数返回一个字符串(内容),而不是JSON字符串<代码>返回$response代码>就足够了。在下载文件中
:返回json\u encode($response,json\u PRETTY\u PRINT)如果不是你说的JSON,代码>可能不应该在那里?大概你只是在编码一个字符串。只需归还内容?@drew010就是这样!我甚至为下载创建了单独的方法,但没有意识到我正在将其格式化为json。把它写下来作为答案,因为这就是答案。多谢各位!很高兴是这样!我把它作为一个答案贴出来,这样你就可以接受并提高你的声誉。
<?php
require_once 'core/init.php';
$login = 'username';
$password = 'password';
$url = 'https://example.com/api';
$data = array("someRequest", 25);
$data_string = json_encode($data);
$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);
$file = curl_exec($ch);
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($file, 0, $header_size);
$body = substr($file, $header_size);
$header_items = explode("\n", $header);
curl_close($ch);
echo '<pre>'.print_r($file, true).'</pre>';
exit();
?>