php curl отправка файла

Технология cURL

Я знаю достаточно много примеров, где для получения сторонних web-страниц (парсеры) использовались совершенно другие способы, отличные от cURL. Например:

Почему разработчики использовали их и что в них не так? А потому, что не знали, либо не хотели знать, что такое cURL. А не так в них то, что функционал ограничен: получили страницу и все на этом, в то время, как cURL может отправить форму на странице, получить ответ, обработать ошибку, начать всё заново и т.д.

Принцип работы cURL

При использовании cURL-запросов существует 4 основных шага, которые должны (обязаны) быть в вашем скрипте, это:

Без любого из этих шагов ваш скрипт обречен на неудачу. Итак, основные шаги:

Думаю что все шаги вам понятны за исключением второго: «Указания параметров». На этом шаге мы остановимся более подробно, т.к. именно он задает все необходимые настройки / параметры / методы.

Ошибки в ходе работы скрипта

Дабы не нагружать сервер дальнейшими вычеслениями, всегда проверяйте результат выполнения функции curl_exec:

Отмечу, что знак сравнения здесь ‘===’, а не ‘==’, т.е. сравнивается именно на наличие логического FALSE, а не пустой строки или строки ‘false’.

Результат запроса

Ну а после того, как CURL-запрос был выполнен, неплохо бы было знать, что он вернул:

А вот какие еще даные мы можем получить:

Индекс массиваЗначениеИндекс массиваЗначение
urlstring(17) «https://intop24.ru»content_typestring(24) «text/html; charset=utf-8»
http_codeint(200)header_sizeint(218)
request_sizeint(49)filetimeint(-1)
ssl_verify_resultint(0)redirect_countint(0)
total_timefloat(0.009419)namelookup_timefloat(1.3E-5)
connect_timefloat(1.3E-5)pretransfer_timefloat(1.4E-5)
size_uploadfloat(0)size_downloadfloat(46523)
speed_downloadfloat(4939271)speed_uploadfloat(0)
download_content_lengthfloat(-1)upload_content_lengthfloat(0)
starttransfer_timefloat(0.009374)redirect_timefloat(0)
certinfoarray(0)

redirect_urlstring(0) «»

POST запрос с помощью CURL

Давайте напишем наш первый скрипт, который отправит данные методом POST на какую-нибудь страницу и посмотрит, что отобразилось на этой странице.

Сначала нам нужен файл, который бы принял наши данные и что-то вывел на страницу. Я расположил его по адресу https://intop24.ru/demo/curl/post.php. В нем содержится следующий код:

Теперь попробуем передать туда какие-то данные:

Результат можно посмотреть здесь: curl_post.php

Отправка файла с помощью CURL

Смысл здесь абсолютно такой же, как и в запросе POST.

Файл, который примет данные: https://intop24.ru/demo/curl/upload_file.php.

Теперь попробуем передать туда какие-то данные:

Результат можно посмотреть здесь: curl_post_file.php

HTTP аутентификация с помощью CURL

Довольно полезная штука.

Запрос сURL через прокси

Источник

Загрузка файла на сервер без использования формы

Со временем возникла необходимость через формы отсылать еще и файлы. Тогда консорциум W3C взялся за доработку формата POST запроса. К тому времени уже достаточно широко применялся формат MIME (Multipurpose Internet Mail Extensions — многоцелевые расширения протокола для формирования Mail сообщений), поэтому, чтобы не изобретать велосипед заново, решили использовать часть данного формата формирования сообщений для создания POST запросов в протоколе HTTP.

Главное отличие multipart/form-data от application/x-www-form-urlencoded в том, что тело запроса теперь можно поделить на разделы, которые разделяются границами. Каждый раздел может иметь свой собственный заголовок для описания данных, которые в нем хранятся, т.е. в одном запросе можно передавать данные различных типов (как в теле письма можно одновременно с текстом передавать файлы). Пример запроса:

Boundary (граница) — это последовательность байтов, которая не должна встречаться внутри передаваемых данных. Content-Length — суммарный объём, включая дочерние заголовки. Само содержимое полей при этом оставляется «как есть».

CURL, multipart/form-data

Файл get.php на сервере http://server.com:

Важный момент: на форуме PHPCLUB.RU встретил упоминание, что может потребоваться указание полного пути файла — иначе CURL выдает ошибку.

CURL, application/x-www-form-urlencoded

Файл get.php на сервере http://server.com:

Сокеты, multipart/form-data

Файл get.php на сервере http://server.com:

Сокеты, application/x-www-form-urlencoded

Файл get.php на сервере http://server.com:

Метод PUT

Описанные выше способы работают для относительно небольших файлов (примерно до 2-х мегабайт, для получения более точного значения необходимо смотреть в настройках PHP максимальный объем принимаемых данных методом POST). Чтобы обойти это ограничение, будем передавать файл методом PUT:

Источник

cURL в PHP: примеры POST, GET запросов с headers, cookie, JSON и многопоточностью

В этой статье мы рассмотрим эффективные приемы работы с cURL, отправление POST, GET и т.д. запросов, работу с cookie, заголовки, JSON а также в конце статьи будут некоторые полезные инструменты, которые могут значительно облегчить вам работу с HTTP запросами.

GET запрос при помощи cURL

Для того, чтобы отправить запрос, нужно создать объект при помощи функции curl_init(), а затем следует настроить его.

Все настройки, которые вы можете найти по этой ссылке. Там вы найдете опции, которые мы будем устанавливать функцией curl_setopt, в дальнейших примерах.

Пример простого GET запроса при помощи cURL:

Если в результате сервер вернет нам редирект, то мы по нему автоматически не перейдем. А иногда это бывает полезно. Чтобы cURL автоматически шел по редиректу нужно установить опцию CURLOPT_FOLLOWLOCATION.

С установленной опцией скрипт автоматически перейдет по вернувшемуся редиректу и вернет ответ уже с итоговой страницы.

POST запрос при помощи cURL

Теперь давайте отправим post запрос на адрес https://httpbin.org/anything

Отлично, с GET и POST запросами в cURL мы немного освоились. Теперь разберемся с заголовками, которые мы можем отсылать в запросе.

Заголовки устанавливаются при помощи опции CURLOPT_HTTPHEADER Чтобы получше узнать, для чего нужна эта опция давайте попробуем отправить POST запрос в формате JSON

cURL: POST запрос в формате JSON

Отличия конфигурации JSON запроса от обычного POST запроса заключается в том, что мы кодируем поля при помощи json_encode() И добавляем заголовок Content-Type: application/json

cURL: GET запрос в формате JSON

GET запрос в формате JSON отправляется так же как и POST запрос, просто нужно CURLOPT_CUSTOMREQUEST установить в ‘GET’

cURL и другие виды HTTP запросов: PUT, DELETE, HEAD, PATCH, OPTIONS, CONNECT и т.д.

Стоп, Дмитрий, прекрати выдумывать виды запросов!

Ничего я не выдумываю: HTTP протокол предполагает множество типов HTTP запросов просто POST и GET являются более распространенными.

Чтобы отправить PUT запрос, нужно установить опцию CURLOPT_PUT таким образом:

Это делается по тому же принципу, как и CURLOPT_POST. Но что делать с остальным зоопарком запросов? Разве у cURL есть CURLOPT_DELETE или CURLOPT_HEAD? Нет.

Для того, чтобы отправлять другие виды запросов есть другая опция: CURLOPT_CUSTOMREQUEST

Вместо строки curl_setopt($curl, CURLOPT_POST, true); мы явно задаем имя запроса опцией CURLOPT_CUSTOMREQUEST:

Замечание: Не используйте эту возможность пока не убедитесь, что сервер поддерживает данный тип запроса.

Как получить заголовки ответа

В предыдущем примере мы научились посылать заголовки. Самый правильный способ принять заголовки:

Иногда можно встретить другой вариант получения заголовков ответа. К сожалению, они не совсем правильные и могут работать некорректно в некоторых случаях.

Рассмотрим такой пример:

Мы сначала определяем размер заголовка, с помощью CURLINFO_HEADER_SIZE затем вырезаем его из ответа. К сожалению, это может не срабатывать, когда используется прокси или в некоторых случаях редиректа.

Скачивание больших файлов с помощью cURL

Для того, чтобы скачать большой файл пригодится этот способ:

Обратите внимание, если вы будете использовать file_get_contents для скачивания файлов, то файл сначала загружается в оперативную память, а потом сохраняется на диск. Поэтому если файл действительно большой, то скорее всего вашему серверу не хватит памяти. Также к памяти будет требователен следующий код:

Здесь мы скачиваем файл при помощи cURL в оперативную память, а затем сохраняем его на диск. Не смотря на то, что этот способ не годится для скачивания больших файлов, с помощью него можно вполне сохранить простую веб страницу.

Параллельные cURL запросы в PHP

Для чего могут потребоваться многопоточные запросы? Например у нас есть много URL адресов:

И если мы будем по очереди отправлять запросы, то второй запрос начнется только после того, как закончился первый и так далее, а это существенно увеличивает время работы скрипта.

Как выполнить 3 запроса одновременно? В этом нам поможет curl_multi_

Давайте решим конкретную задачу при помощи параллельных curl запросов. Нам нужно отправить одновременно 3 запроса.

Такие параллельные запросы выполняются значительно быстрее чем поочередные.

cURL запросы с сохранением и загрузкой cookie из файла

cURL позволяет нам установить cookie при передачи запросов, а также автоматически принимать и устанавливать cookie, которые нам возвращает сервер, сохраняя их между запросами.

Давайте рассмотрим такой пример:

Теперь cookie у нас хранятся в файле cookie.txt в директории со скриптом (если вы ничего не меняли). Если мы совершаем повторные запросы, то cURL автоматически берет и отправляет cookie на сервер, как и обычный браузер. Таким образом мы можем авторизироваться на сайте и сохранить сеанс между запросами.

Передача cookie без файлов

Иммитация браузера с помощью cURL

Иногда сайт, к которому мы обращаемся может фильтровать запросы, защищаясь от парсинга. Если для этого используются упрощенные способы защиты, например проверка User-Agent, то мы можем легко притвориться, что являемся реальным польователем, который взаимодействует с сайтом через браузер, мы можем послать заголовки и cookie, которые обычно посылает браузер.

В данном примере установлены заголовки, которые посылает Chrome.

В простых ситуациях этого хватает. Но если используется защита при помощи javascript или что-то более продвинутое, то здесь cURL бессилен, и следует использовать либо BAS либо Zennoposter. Либо если вы хотите попытать счастье с PHP, то Selenium.

Не используйте эти знания в противоправных целях.

cURL запросы через прокси

Простой пример для отправки запросов через proxy. Если ваш прокси предполагает авторизацию, то раскомментируйте соответствующие строчки.

Отправка файлов

Авторизация с помощью cURL

HTTP Авторизация

Чтобы с помощью cURL авторизироваться на сайте, который использует Basic HTTP-аутентификацию нужно установить опцию CURLOPT_USERPWD, в которой будет наш логин и пароль.

OAuth авторизация

Авторизация через форму

Давайте применим полученные нами знания и авторизируемся на каком-нибудь сайте. Для этого нужно посмотреть куда форма отправляет данные и отправить туда то же самое.

Допустим на сайте есть такая форма:

Тогда наш cURL запрос должен быть сформирован так:

Автоматическое построение запросов

Перевод консольной команды curl в PHP

И вот еще один сервис, который переводит консольную команду curl в PHP: https://incarnate.github.io/curl-to-php/

Так вы можете создать простые запросы на cURL в PHP не создавая их вручную.

Лайфхак

В консоли браузера, во вкладке сеть, вы можете кликнуть правой кнопкой мыши и скопировать любой запрос в виде команды cURL, а потом с помощью сервиса curl-to-php перевести запрос в PHP. Теперь вы вообще можете сконвертировать в cURL абсолютно любой запрос, который посылает ваш браузер.

Как работать с cURL гораздо проще

Вы можете спросить: почему у cURL такие кривые и страшные методы? У вас может возникнуть желание взять и создать обертку для работы с cURL, чтобы вы могли не писать каждый раз большие куски некрасивого кода, а писать все проще, например так:

К счастью, такая обертка уже написана и найти ее можно здесь: https://github.com/php-curl-class/php-curl-class

Просто установите ее при помощи: composer require php-curl-class/php-curl-class и не работайте с кривыми кусками кода, которые таковы вероятно потому, что cURL изначально консольное приложение.

POST и GET запросы без cURL

С помощью PHP мы можем отправить простой GET запрос используя функцию file_get_contents.

При помощи file_get_contents мы также можем отправить POST запрос.

Подробнее о том, какие опции можно передавать в stream_context_create, вы можете изучить здесь: http://docs.php.net/manual/ru/context.http.php

Другие инструменты для работы с запросами в PHP

Для работы с запросами есть еще более мощный инструмент: Guzzle

Несколько примеров на Guzzle

GET запросы на Guzzle

Разные типы запросов на Guzzle

Асинхронные запросы на Guzzle

Если интересно, то читайте: Guzzle Quick Start

Пишите комментарии, если что-то осталось не понятно.

Источник

Как выгрузить файлы методом POST с помощью cURL. Как отправить форму в cURL

Метод POST — это один HTTP методов (другой популярный метод это GET). Методом POST можно отправить больший объём данных чем методом GET.

cURL — это сетевая утилита, которая поддерживает множество протоколов обмена данными, в том числе HTTP и разные методы этого протокола (GET, POST, HEAD). С помощью cURL можно получать страницы веб-сайтов, скачивать и закачивать файлы. В этой инструкции будет показано, как выгрузить файл с помощью cURL методом POST.

Суть очень проста. Каждый из нас множество раз выгружал файлы с компьютера на сайт, например, фотографию для профиля или файл в файлообменник. Мы используем веб-браузер, который методом POST отправляет файл. Вместо браузера можно отправлять файл с помощью команды curl, которая также умеет использовать метод POST.

На сервере создайте файл uploader.php:

php curl отправка файла. Смотреть фото php curl отправка файла. Смотреть картинку php curl отправка файла. Картинка про php curl отправка файла. Фото php curl отправка файла

С компьютера, с которого нужно выгрузить файл, запустите команду вида:

Опция -F/—form для семейства протоколов HTTP означает эмулировать заполненную форму, в которой пользователь нажал кнопку «Отправить». Это приводит к тому, что curl отправляет данные методом POST используя Content-Type multipart/form-data.

Обратите внимание, что содержимое файла присваивается переменной file. В скрипте выше этой переменной соответствует переменная выгрузки (массив) $_FILES[‘file’]. При изменении имени, не забывайте менять его как в отправляемых данных, так и в скрипте на стороне сервера.

Как эмулировать отправку из формы в cURL

С помощью опции -F можно эмулировать отправку формы и без файла. Например, в следующем примере отправляются два текстовых поля:

В следующем примере файл отправляется в виде простого текста, но его содержимое берётся из локального файла hugefile.txt, обратите внимание на использование символа перенаправления вывода

Вы можете добавить пользовательские заголовки в поле, установив заголовки headers=, примерно так:

Источник

Отправить файл через cURL из сообщения формы в PHP

однако у меня возникли трудности с пониманием того, как обрабатывать эту серверную сторону и отправлять вместе с запросом cURL.

я знаком с отправкой POST запросы с cURL с массивом данных, и ресурсы, которые я прочитал при загрузке файлов, говорят мне префикс имени файла с @ символ. Но эти же ресурсы жестко закодированное имя файла, например,

или я иду по неправильному пути? Любой совет был бы очень признателен.

EDIT: если бы кто-нибудь мог дать мне фрагмент кода, куда я бы пошел со следующими фрагментами кода, я был бы очень благодарен. Я в основном после чего я бы отправил как параметры cURL, так и пример того, как использовать эти параметры с принимающим скриптом (назовем его curl_receiver.php ради спора).

у меня есть эта веб-форма:

и это будет script.php :

8 ответов

вот рабочий код, который отправляет файл на FTP (может быть хорошим решением для вас):

для людей, находящих этот пост и использующих РНР5.5+, это может помочь.

я обнаружил, что подход, предложенный netcoder, не работает. т. е. это не работает:

оказывается, что для рнр5.5+ есть новый curl_file_create() функции нужно использовать. Так что вышеперечисленное стало бы:

как @ формат теперь устарел.

Это должно работать:

в получающем скрипте у вас будет:

затем, если вы хотите правильно обработать загрузку файла, вы должны сделать что-то вроде этого:

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

он работает для меня при отправке вложения в Mercadolibre через его систему обмена сообщениями.

объект cURL file в процедурном методе:

объект cURL file в методе ООП:

мы можем загрузить файл изображения по запросу curl, преобразовав его в строку base64.Поэтому в post мы отправим строку файла, а затем скроем это в образе.

затем отправьте его в curl request

вот мое решение, я читал много сообщений, и они были действительно полезны, наконец, я создаю код для небольших файлов с cUrl и Php, что я думаю, что это действительно полезно.

С этим мы должны быть на » api.конечная точка.сообщение » размещены следующие vars Вы можете легко протестировать этот скрипт, и вы должны получить эти отладки в функции postFile () в последней строке

print_r ($response); //print response

здесь вы должны работать хорошо, могут быть лучшие решения, но это работает и действительно полезно, чтобы понять, как граница и multipart/from-data mime работает на php и curl library,

Мои Лучшие Реггарды,

мои извинения за мой английский, но это не мой родной язык.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *