powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP Как передать файл по curl
21 сообщений из 21, страница 1 из 1
PHP Как передать файл по curl
    #40131101
trom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подключаюсь по API к сайту, нужно передать файл изображения, они предоставляют примеры с пхп кодом и классами для работы с курл, после общения с поддержкой выяснил чтобы передать файл его нужно грузить в формате "formData" object. Примеров как это сделать на пхп что то не нашел
вот мои попытки что то сделать, если надо приведу код классов, файл 1.jpg лежит на сервере в одной папке с php файлом вызывающим этот код

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
$formData = new FormData();
$formData.append("file", "1.jpg");
$url = 'https://api.example.com/v2/library/file';
$params = array(
    'file'  => $formData,
    'type'  => 'image'
);

$request = new Request($url, 'POST', $params);
$request->setAuthorizationHeader($token->type, $token->token);
$request->send();
$response = $request->getResponse();
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40131113
MikkiMouse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trom,

CURL'ом вот как-то так передают:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    $curlFile = curl_file_create($uploaded_file_name_with_full_path);
    $post = [
        'val1' => 'value1',
        'val2' => 'value2',
        'file_contents'=> $curlFile
    ];
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $your_url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    $result = curl_exec($ch);
    curl_close($ch);



А что ты пытаешься сделать - непонятно. Кто такой " new FormData(); " ?
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40131124
trom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MikkiMouse,

попытался передать так

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
$curlFile = curl_file_create("1.jpg");
$url = 'https://api.example.com/v2/library/file';
$params = array(
    'file'  => $curlFile,
    'type'  => 'image'
);

$request = new Request($url, 'POST', $params);
$request->setAuthorizationHeader($token->type, $token->token);
$request->send();
$response = $request->getResponse();


ничего не получилось, получаю ту же ошибку после вывода на экран print_r($response);
"message":["You have to upload one file"]

вот код классов


Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
class Request {

    /**
     * @var resource
     */
    protected $_request;

    /**
     * @var integer
     */
    protected $_method;

    /**
     * @var string
     */
    protected $_url;

    /**
     * @var array
     */
    protected $_headers = array(
        'Content-type: application/json'
    );

    /**
     * @var string|array
     */
    protected $_params;

    /**
     * @var object Response
     */
    protected $_reponse;

    /**
     * Constructor
     *
     * @param   string      $url
     * @param   string      $method
     * @param   array       $params
     */
    public function __construct($url, $method, $params = array()) {

        $this->_url = $url;

        // Set the method
        $this->_method = $method;

        // Set the params
        $this->_params = $params;
    }

    /**
     * Determine the Request method
     *
     * @param   string  $method
     */
    private function setMethod() {

        switch($this->_method) {
            case 'GET':
                break;
            case 'POST':
                curl_setopt($this->_request, CURLOPT_POST, 1);
                break;
            case 'PUT':
                curl_setopt($this->_request, CURLOPT_CUSTOMREQUEST, 'PUT');
                break;
            case 'DELETE':
                curl_setopt($this->_request, CURLOPT_CUSTOMREQUEST, 'DELETE');
                break;
        }
    }

    /**
     * Add authorization header
     *
     * @param   string  $type
     * @param   string  $token
     */
    public function setAuthorizationHeader($type, $token) {

        $authorization = $type . ' ' . $token;

        $this->_headers[] = 'Authorization: ' . $authorization;
    }

    /**
     * Add body to request
     */
    private function addBody() {

        if($this->_method != 'GET' && empty($this->_params) == false) {

            if(is_array($this->_params)) {
                // JSON Encode the array
                $this->_params = json_encode($this->_params);
            }

            curl_setopt($this->_request, CURLOPT_POSTFIELDS, $this->_params);

            // Add a content-length header
            $this->_headers[] = 'Content-length: ' . strlen($this->_params);
        }
    }

    /**
     * Add a query string to the request
     */
    private function addQueryString() {

        if($this->_method == 'GET' && is_array($this->_params) && count($this->_params) > 0) {

            $query_string = '?';

            foreach($this->_params as $param => $value) {

                $query_string = $query_string . $param . '=' . $value . '&';
            }

            trim($query_string, '&');

            $this->_url = $this->_url . $query_string;
        }
        else {

            if(is_array($this->_params) && count($this->_params) > 0 && strpos($this->_url, '{') !== false) {
                // Pattern match params against the url
                foreach($this->_params as $param => $value) {
                    $this->_url = preg_replace('/{' . $param . '}/', $value, $this->_url);
                }
            }
        }
    }

    /**
     * Send the request
     */
    public function send() {

        // Initialise cUrl request
        $this->_request = curl_init();

        // Return the response as a string
        curl_setopt($this->_request, CURLOPT_RETURNTRANSFER, 1);

        // Add a query string
        $this->addQueryString();

        // Set the URL
        curl_setopt($this->_request, CURLOPT_URL, $this->_url);

        // Set request method
        $this->setMethod();

        // Add a body
        $this->addBody();

        if(empty($this->_headers) == false) {
            // Set the headers
            curl_setopt($this->_request, CURLOPT_HTTPHEADER, $this->_headers);
        }

        // Disable SSL checks
        curl_setopt($this->_request, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($this->_request, CURLOPT_SSL_VERIFYHOST, false);

        // Send the request and store the body
        $this->_response = new Response(curl_exec($this->_request));

        // Set the status code
        $this->_response->setStatusCode(curl_getinfo($this->_request, CURLINFO_HTTP_CODE));

        // Close the connection
        curl_close($this->_request);
    }

    /**
     * Get the response
     *
     * @return object
     */
    public function getResponse() {

        return $this->_response;
    }
}

class Response {

    /**
     * @var array
     */
    protected $_reason_phrases = array(
        //Informational 1xx
        100 => "Continue",
        101 => "Switching Protocols",

        // Successful 2xx
        200 => "OK",
        201 => "Created",
        202 => "Accepted",
        203 => "Non-Authoritative Information",
        204 => "No Content",
        205 => "Reset Content",
        206 => "Partial Content",

        // Redirection 3xx
        300 => "Multiple Choices",
        301 => "Moved Permanently",
        302 => "Found",
        303 => "See Other",
        304 => "Not Modified",
        305 => "Use Proxy",
        306 => "(Unused)",
        307 => "Temporary Redirect",

        // Client Error 4xx
        400 => "Bad Request",
        401 => "Unauthorized",
        402 => "Payment Required",
        403 => "Forbidden",
        404 => "Not Found",
        405 => "Method Not Allowed",
        406 => "Not Acceptable",
        407 => "Proxy Authentication Required",
        408 => "Request Timeout",
        409 => "Conflict",
        410 => "Gone",
        411 => "Length Required",
        412 => "Precondition Failed",
        413 => "Request Entity Too Large",
        414 => "Request-URI Too Long",
        415 => "Unsupported Media Type",
        416 => "Requested Range Not Satisfiable",
        417 => "Expectation Failed",

        // Server Error 5xx
        500 => "Internal Server Error",
        501 => "Not Implemented",
        502 => "Bad Gateway",
        503 => "Service Unavailable",
        504 => "Gateway Timeout",
        505 => "HTTP Version Not Supported"
    );

    /**
     * @var integer
     */
    protected $_status_code;

    /**
     * @var string
     */
    protected $_body;

    /**
     * Constructor
     *
     * @param   string      $body
     */
    public function __construct($body) {

        $this->_body = $body;
    }

    /**
     * Constructor
     *
     * @param   string      $status_code
     */
    public function setStatusCode($status_code) {

        $this->_status_code = $status_code;
    }

    /**
     * Get status code
     *
     * @return  integer
     */
    public function getStatusCode() {

        return $this->_status_code;
    }

    /**
     * Get body
     *
     * @return  string
     */
    public function getBody() {

        return $this->_body;
    }

    /**
     * Get body JSON Decoded
     *
     * @return  object|null
     */
    public function getBodyDecoded() {

        return json_decode($this->_body);
    }

    /**
     * Get reason phrase
     *
     * @return string|boolean
     */
    public function getReasonPhrase() {

        if(array_key_exists($this->_status_code, $this->_reason_phrases)) {

            return $this->_reason_phrases[$this->_status_code];
        }
        else {

            return false;
        }
    }
}
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40131130
MikkiMouse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trom,

Код: php
1.
2.
3.
4.
5.
6.
/**
     * @var array
     */
    protected $_headers = array(
        'Content-type: application/json'
    );



Вот это наверно надо убрать - ты же шлешь файл, а не джейсона.
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40131153
trom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MikkiMouse,

поменял на
Код: php
1.
'Content-type: multipart/form-data'


но не помоголо

вот полный ответ по $request

Response Object ( [_reason_phrases:protected] => Array ( [100] => Continue [101] => Switching Protocols [200] => OK [201] => Created [202] => Accepted [203] => Non-Authoritative Information [204] => No Content [205] => Reset Content [206] => Partial Content [300] => Multiple Choices [301] => Moved Permanently [302] => Found [303] => See Other [304] => Not Modified [305] => Use Proxy [306] => (Unused) [307] => Temporary Redirect [400] => Bad Request [401] => Unauthorized [402] => Payment Required [403] => Forbidden [404] => Not Found [405] => Method Not Allowed [406] => Not Acceptable [407] => Proxy Authentication Required [408] => Request Timeout [409] => Conflict [410] => Gone [411] => Length Required [412] => Precondition Failed [413] => Request Entity Too Large [414] => Request-URI Too Long [415] => Unsupported Media Type [416] => Requested Range Not Satisfiable [417] => Expectation Failed [500] => Internal Server Error [501] => Not Implemented [502] => Bad Gateway [503] => Service Unavailable [504] => Gateway Timeout [505] => HTTP Version Not Supported ) [_status_code:protected] => 400 [_body:protected] => {"message":["You have to upload one file"]} )
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40131246
estic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
trom
после общения с поддержкой выяснил чтобы передать файл его нужно грузить в формате "formData" object. Примеров как это сделать на пхп что то не нашел
Наверное, потому что это JS-объект :) По крайней мере PHP-класс с этим именем вы так и не показали ;)
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40131253
trom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
estic,

этого класса нет, это я ошибся, мало работал с классами в пхп.
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40131256
estic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделайте без показанных классов, при необходимости в них заглядывая или лучше заглядывая непосредственно в документацию по API. Например, понятно что авторизацию нужно выполнять при помощи такого заголовка:
Код: sql
1.
'Authorization: ' . $type . ' ' . $token;
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40131288
trom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
estic,

это классы от сайта чье API в примерах, через них в любом случае лучше работать

вот в справке даже есть запрос по CURL с заливкой файла, что и как передавать по курлу и заголовки ответа

Curl
curl -X POST --header 'Content-Type: multipart/form-data' --header 'Accept: application/json' --header 'Authorization: Bearer 304a0cd4a4ef23f7c5f7b95520d64d94d891be22' {"type":"formData"} 'https://api.example.com/v2/library/file'


Response Headers
{
"access-control-allow-headers": "X-Requested-With, Content-Type, Accept, Origin, Authorization, ap-exads, ap-exads-uuid, Cache-Control, ngsw-bypass",
"access-control-allow-methods": "GET, POST, PUT, DELETE, OPTIONS",
"access-control-allow-origin": "*",
"access-control-expose-headers": "X-Adv-Status",
"access-control-max-age": "86400",
"content-type": "application/json",
"date": "Wed, 02 Feb 2022 13:50:11 GMT",
"server": "nginx",
"x-rate-limit-by": "ip",
"x-rate-limit-limit": "200",
"x-rate-limit-remaining": "198",
"x-rate-limit-reset": "40"
}
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40131379
estic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что за фигурные скобки в команде? Если это тело запроса, то этот запрос явно предназначен не для загрузки графического файла.

Дайте ссылку на оригинал описания, чтобы не играть в "испорченный телефон".
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40131394
trom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
estic,

это не команда и не код, а ответ сервера в формате json как понимаю

https://api.exoclick.com/v2/docs/#!/47library/post_library_file тут описание как грузить файл и ответы сервера
нужно нажать try it
если ака нет то скажет что надо авторизоваться, сам текст ответа я привел выше тот который в фигурных скобках

https://docs.exoclick.com/docs/api-manual-php-examples/ тут примеры php кода
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40131425
estic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
facepalm. Я специально добавил слово "команда", чтобы вы понимали о какой из двух пар фигурных скобок идет речь. Видимо, зря старался.

Извините, ваш экзоклик со всеми поддоменами в черном списке DrWeb.
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40131444
trom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
estic,

вот скрин запроса
https://clip2net.com/s/4eOJpBS

остальное я выложил
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40131583
estic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Видимо, требуется два параметра:
- числовой height (значение можно указать и в строке, например '200');
- с загружаемым файлом file.

Используя код из первого ответа в теме, сформируйте соответствующим образом массив $post.

И не забудьте показанные заголовки добавить. Content-Type можно не указывать явно, т.к. он будет сформирован автоматически при наличии массива в $post.
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40131792
trom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
estic,

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
$curlFile = curl_file_create("1.jpg");
$url = 'https://api.exoclick.com/v2/library/file';
$params = array(
    'file'  => $curlFile,
    'height'  => '192',
    'width'  => '192',
    'type'  => 'image'    
);



так?
а заголовки куда?
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40131896
уже wget возьмите и отправьте через system()
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40132147
trom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
бабушкин зайчик,

что это мне даст?
я же хочу через php
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40132159
даст решение задачи
system() - в ПХП
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40132204
trom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
бабушкин зайчик,

то есть запуском внешней проги из пхп?
ну так а чем это лучше чем сам пхп я из него тоже немогу отрпавить
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40132303
тем что в wget всё уже готово
просто гуглишь нужный синтаксис и юзаешь
...
Рейтинг: 0 / 0
PHP Как передать файл по curl
    #40132412
estic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
trom
немогу
Немощный? Не можете загуглить, как в PHP CURL устанавливать заголовки, или заглянуть в собственноручно выложенные классы?
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP Как передать файл по curl
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (8): Анонимы (6), Bing Bot, Yandex Bot 1 мин.
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]