Curl передать файл post

Обновлено: 03.07.2024

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

Для решения таких задач и задач подобного круга можно воспользоваться утилитой curl. Она позволяет решить намного более широкий круг задач, среди которых даже имитация действий пользователя на сайте. В этой статье мы рассмотрим как пользоваться curl, что это такое и зачем нужна эта программа.

Что такое curl?

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

Команда curl

Перед тем как перейти к описанию того как может использоваться команда curl linux, давайте разберем саму утилиту и ее основные опции, которые нам понадобятся. Синтаксис утилиты очень прост:

$ curl опции ссылка

Теперь рассмотрим основные опции:

Это далеко не все параметры curl linux, но здесь перечислено все основное, что вам придется использовать.

Как пользоваться curl?

Мы рассмотрели все, что касается теории работы с утилитой curl, теперь пришло время перейти к практике, и рассмотреть примеры команды curl.

Загрузка файлов

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

А если вы хотите, чтобы полученный файл назывался так же, как и файл на сервере, используйте опцию -O:

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

Если нужно, одной командой можно скачать несколько файлов:

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

Данная команда скачает файл, только если он был изменен после 21 декабря 2017.

Ограничение скорости

Вы можете ограничить скорость загрузки до необходимого предела, чтобы не перегружать сеть с помощью опции -Y:

Здесь нужно указать количество килобайт в секунду, которые можно загружать. Также вы можете разорвать соединение если скорости недостаточно, для этого используйте опцию -Y:

Передача файлов

Загрузка файлов, это достаточно просто, но утилита позволяет выполнять и другие действия, например, отправку файлов на ftp сервер. Для этого существует опция -T:

В ответе утилита сообщит где вы можете найти загруженный файл.

Отправка данных POST

Вы можете отправлять не только файлы, но и любые данные методом POST. Напомню, что этот метод используется для отправки данных различных форм. Для отправки такого запроса используйте опцию -d. Для тестирования будем пользоваться тем же сервисом:

Если вас не устраивает такой вариант отправки, вы можете сделать вид, что отправили форму. Для этого есть опция -F:

Здесь мы передаем формой поле password, с типом обычный текст, точно так же вы можете передать несколько параметров.

Передача и прием куки

Куки или Cookie используются сайтами для хранения некой информации на стороне пользователя. Это может быть необходимо, например, для аутентификации. Вы можете принимать и передавать Cookie с помощью curl. Чтобы сохранить полученные Cookie в файл используйте опцию -c:

Передача и анализ заголовков

Не всегда нам обязательно нужно содержимое страницы. Иногда могут быть интересны только заголовки. Чтобы вывести только их есть опция -I:

Аутентификация curl

Использование прокси

Если вам нужно использовать прокси сервер для загрузки файлов, то это тоже очень просто. Достаточно задать адрес прокси сервера в опции -x:

Выводы

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

Favorite

Добавить в избранное

Главное меню » Linux » Как сделать POST-запрос с помощью cURL

5 основных примеров команды Curl

Создание POST-запроса

Общая форма команды curl для выполнения запроса POST выглядит следующим образом:

Тип тела запроса указывается его заголовком Content-Type.

Обычно запрос POST отправляется через форму HTML. Данные, отправляемые в форму, обычно закодированы в виде multipart/form-data или типе содержимого application/x-www-form-urlencoded.

Чтобы создать запрос POST, используйте параметр -F, а затем пару field=value. В следующем примере показано, как сделать POST-запрос к форме с полями «name» и «email»:

Когда опция -F используется, curl отправляет данные, используя multipart/form-dataContent-Type.

Если опция -d используется более одного раза, вы можете объединить данные, используя символ &:

Указание типа контента

Чтобы установить определенный заголовок или тип содержимого, используйте параметр -H. Следующая команда устанавливает тип запроса POST application/json и отправляет объект JSON:

Загрузка файлов

Чтобы POST файл с curl, просто добавьте символ @ перед местоположением файла. Файл может быть архивом, изображением, документом и т. д.

Вывод

Мы показали вам, как использовать curl для выполнения запросов POST. Для получения дополнительной информации curl посетите страницу 5 примеров использования команды Curl.

Читать 7 инструментов командной строки, которые сделают вашу жизнь проще

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

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

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

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

  • Инициализация
  • Назначение параметров
  • Выполнение и выборка результата
  • Освобождение памяти

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

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

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

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

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

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

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

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

Индекс массива Значение Индекс массива Значение
url string(17) "https://intop24.ru" content_type string(24) "text/html; charset=utf-8"
http_code int(200) header_size int(218)
request_size int(49) filetime int(-1)
ssl_verify_result int(0) redirect_count int(0)
total_time float(0.009419) namelookup_time float(1.3E-5)
connect_time float(1.3E-5) pretransfer_time float(1.4E-5)
size_upload float(0) size_download float(46523)
speed_download float(4939271) speed_upload float(0)
download_content_length float(-1) upload_content_length float(0)
starttransfer_time float(0.009374) redirect_time float(0)
certinfo array(0) redirect_url string(0) ""

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

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

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

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

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

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

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

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

Загрузка файла - это тот же самый POST-запрос, однако перед путем к файлу стоит знак "@", что и обозначает, что нужно это передать не как $_POST, а как $_FILES.

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

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

Крутов Герман

Понравилась или помогла статья? Самое лучшее, что ты можешь сделать - это поделиться ею в любой из своих соцсетей (даже если ты поделишься в твиттере или google+, которыми ты не пользуешься - это очень поможет развитию моего блога). Спасибо! А если ты еще и оставишь любой комментарий снизу в обсуждениях, то это будет двойное СПАСИБО!

я пишу API и я хочу обрабатывать загрузку файлов из формы POST . Разметка для формы не слишком сложна:

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

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

Ну, какой путь к файлу это? Где я его найду? Будет ли это что-то вроде $_FILES['image']['tmp_name'] в этом случае моя $post массив должен выглядеть так:

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

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

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

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

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

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

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

Я бы получил в $_POST Варе 'uploaded_file' поле - и ничего $_FILES var.

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

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

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

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

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

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

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

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

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

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

print_r ($response); //print response

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

Запросы cURL в PHP на примерах

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

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

  • отправка формы;
  • обработка ответа;
  • передача, получение или удаление файла;
  • отправка или получение cookie

Итак, как правильно построить cUrl запрос и какие есть типы запросов разберем далее.

Отправка cURL запроса PHP

Отправка cUrl запроса PHP

Формирование cURL запроса состоит из четырех этапов:

  1. Инициализация
  2. Указание параметров
  3. Выполнение команды и получение результата
  4. Освобождение памяти

Итак, как это должно выглядеть в коде:

Этапы 1,3 и 4 типовые для всех типов запросов. А на этапе 2, в зависимости от указанных параметров, как раз и формируется тот или иной тип запроса.

Получение информации о запросе cUrl

Получение информации о запросе cUrl

Чтобы получить исчерпывающую информацию о самом запросе используется функция curl_getinfo(). Главным образом эта информация полезна для отладки работы скрипта, в котором выполняются cURL запросы.

Функция возвращает данные в виде массива со следующими ключами:

GET запросы cUrl в PHP

GET cUrl запрос в PHP

Или можно использовать аналог через функцию file_get_contents():

POST запросы cUrl в PHP

POST cUrl запрос в PHP

Функция file_get_contents() так же умеет отправлять POST запросы. Для этого нужно использовать заголовки:

Мульти запросы cURL в PHP

Мультизапросы cURL

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

Одной из самых важных особенностью cURL в PHP является возможность осуществлять несколько асинхронных запросов одновременно.

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

Эта особенность позволяет оптимизировать работу скрипта и сократить время его выполнения.

Функция curl_multi_exec() многократно вызывается в цикле с постусловием, где параметр $running имеет значение количества активных соединений.

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

Отправка файлов на другой сервер используя cURL

Отправка файлов на другой сервер используя cURL

Есть несколько вариантов передачи файлов между серверами.

Методом POST

Методом PUT

Методом FTP

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

Скачивание файлов

Скачивание файлов через cURL

При передаче указателя на открытый файл в параметре CURLOPT_FILE результат выполнения скрипта записывается сразу в файл.

DELETE запрос для удаления файла

Удаление файла через cURL

Запрос через proxy

Запрос через proxy в cURL

Когда нужно сделать запрос, подменив при этом источник запроса на промежуточный адрес, то используйте опцию PROXY:

Для сохранения куки в файле необходимо указать путь к этому файлу в соответствующих параметрах CURLOPT_COOKIEFILE и CURLOPT_COOKIEJAR.

Параметр CURLOPT_COOKIE используется для принудительной передачи значения куки:

Имитация браузера через запросы cURL в PHP

Имитация браузера через cURL в PHP

Многие сайты защищаются от парсинга, отслеживая данные переменных user agent, referer, cookie. На сервере проверяются эти данные и, если подозрений на парсинг нет, то возвращается страница сайта.

Так как запросы curl в php данные этих переменных не передают, то такая защита от парсинга сайта вернет ошибку 404 или 500. Чтобы этого не происходило, можно сымитировать запрос страницы из браузера, добавив, например, следующие заголовки:

Можно посмотреть через панель для разработчиков заголовки, которые передает браузер при обращение к страницам сайтов и использовать их для запроса cURL в PHP.

HTTP авторизация через запросы cURL в PHP

Basic Authorization

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

Если на сайте реализована работа с OAuth протоколом авторизации, который позволяет
выдать права на действия, которые сам сайт сможет производить на другом ресурсе от
лица, авторизовавшегося и давшего это разрешение, пользователя, тогда запрос cURL в php будет выглядеть следующим образом:

Получить HTTP код ответа сервера через cURL в PHP

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

Читайте также: