phtimofeeff
@phtimofeeff
МИРЭА Прикладная математика

Как заменить CURLOPT_POSTFIELDS на CURLFile?

Мне нужно было создать некий скрипт, который бы работал по расписанию с группой ВКонтакте.
Порывшись в интернете нашёл прекрасно подходящее мне решение.
И на базе класса из этого решения создал свой скрипт.

Однако оказалось что начиная с версии PHP 5.5.0, префикс @ устарел и в принципе скрипт работает, но вадаётся следующее предупреждение:
Deprecated: curl_setopt(): The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead in /........./_vk_post/primer.php on line 87

Для удобства понимания line 87 это:
curl_setopt ( $ch, CURLOPT_POSTFIELDS, array( 'file1' => '@' . $file ) );


Код класса целиком:
class vk {
    private $token;
    private $app_id;
    private $group_id;
    private $delta;
    public function __construct( $token, $delta = 5, $app_id = 'xxxxxxx', $group_id = 'xxxxxxxx' ) {
        $this->token = $token;
        $this->delta = $delta;
        $this->app_id = $app_id;
        $this->group_id = $group_id;
    }
    public function post( $desc, $photo, $link ) {
        if( rand( 0, 99 ) < $this->delta ) {
            $data = json_decode(
                        $this->execute(
                            'wall.post',
                            array(
                                'owner_id' => -$this->group_id,
                                'from_group' => 1,
                                'message' => $desc,
                                'attachments' => 'photo-' . $this->group_id . '_' . $photo . ',' . $link
                            )
                        )
                    );
            if( isset( $data->error ) ) {
                return $this->error( $data );
            }
            return $data->response->post_id;
        }
        return 0;
    }
    public function create_album( $name, $desc ) {
        $data = json_decode(
                    $this->execute(
                        'photos.createAlbum',
                        array(
                            'title' => $name,
                            'gid' => $this->group_id,
                            'description' => $desc,
                            'comment_privacy' => 1,
                            'privacy' => 1
                        )
                    )
                );
        if( isset( $data->error ) ) {
            return $this->error( $data );
        }
        return $data->response->aid;
    }
    public function get_album_size( $id ) {
        $data = json_decode(
                    $this->execute(
                        'photos.getAlbums',
                        array(
                            'oid' => -$this->group_id,
                            'aids' => $id
                        )
                    )
                );
        if( isset( $data->error ) ) {
            return $this->error( $data );
        }
        return $data->response['0']->size;
    }
    public function upload_photo( $file, $album_id, $desc ) {
        if( !is_file( $file ) ) return false;
        $data = json_decode(
                    $this->execute(
                        'photos.getUploadServer',
                        array(
                            'aid' => $album_id,
                            'gid' => $this->group_id,
                            'save_big' => 1
                        )
                    )
                );
        if( isset( $data->error ) ) {
            return $this->error( $data );
        }
        $err['photos.getUploadServer'] = $data;
        $ch = curl_init( $data->response->upload_url );
        curl_setopt ( $ch, CURLOPT_HEADER, false );
        curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
        curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );
        curl_setopt ( $ch, CURLOPT_POST, true );
        curl_setopt ( $ch, CURLOPT_SAFE_UPLOAD, true );
        curl_setopt ( $ch, CURLOPT_POSTFIELDS, array( 'file1' => '@' . $file ) );
        $data = curl_exec($ch);
        curl_close($ch);
        $data = json_decode( $data );
        if( isset( $data->error ) ) {
            return $this->error( $data );
        }
        $err['UploadPhoto'] = $data;
        $data = json_decode(
                    $this->execute(
                        'photos.save',
                        array(
                            'aid' => $album_id,
                            'gid' => $this->group_id,
                            'server' => $data->server,
                            'photos_list' => $data->photos_list,
                            'hash' => $data->hash,
                            'caption' => $desc
                        )
                    )
                );
        if( isset( $data->error ) ) {
            $err['photos.save'] = $data;
            return $this->error( $err );
        }
        return $data->response['0']->pid;
    }
    private function execute( $method, $params ) {
        $ch = curl_init( 'https://api.vk.com/method/' . $method . '?access_token=' . $this->token );
        curl_setopt ( $ch, CURLOPT_HEADER, false );
        curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
        curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );
        curl_setopt ( $ch, CURLOPT_POST, true );
        curl_setopt ( $ch, CURLOPT_POSTFIELDS, $params );
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }
    private function error( $data ) {
        var_dump($data);
        return false;
    }
}


Перечитал мануалы и кучу разных вариантов как решить сию проблему, но то ли уж глаз замылился, то ли мозг вскипел, не понимаю как исправить это предупреждение. Вернее пока читаю мануал или совет вроде всё ясно, как сажусь исправлять получается полная хрень.

Может кто уже решал подобную проблему???
  • Вопрос задан
  • 6307 просмотров
Решения вопроса 1
OnYourLips
@OnYourLips
curl_setopt ( $ch, CURLOPT_POSTFIELDS, array( 'file1' => '@' . $file ) );
С 5.5 так делать нельзя.
Более старые версии PHP давно не актуальны, поэтому их поддерживать уже не нужно.

Так же вместо array() следует использовать []: это делает код более читаемым, не рябит в глазах от ))).

curl_setopt($ch, CURLOPT_POSTFIELDS, ['file1' => new CurlFile($file)]);


Однако использовать curl в своем коде - моветон.
Используйте Guzzle, его разработчики уже разобрались с технической частью, и вам это не нужно делать самому.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
RecruitIT Москва
от 100 000 до 160 000 ₽
Simtech Development Санкт-Петербург
от 100 000 ₽
Сбер Москва
До 240 000 ₽