Php 如何使用cURL和OOP从服务器下载二进制响应文件?

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

我已经挣扎了一段时间,不知道我错过了什么

我编写了一个简单的类来使用cURL作为OOP。它可以很好地处理所有API请求,除了一个下载文件的请求

使用POST方法将请求以JSON格式发送到服务器。响应也以JSON的形式出现。下载API是唯一一个不以JSON响应,而是直接以二进制格式发送文件的API。这个似乎不适合我的小班

你能看一下我下面的代码并给我一些建议吗?非常感谢

curlClass.php->包含cURL方法的类文件

<?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)可能不应该在那里?大概你只是在编码一个字符串。只需归还内容?@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();
?>