Метод POST — это один HTTP методов (другой популярный метод это GET). Методом POST можно отправить больший объём данных чем методом GET.
cURL — это сетевая утилита, которая поддерживает множество протоколов обмена данными, в том числе HTTP и разные методы этого протокола (GET, POST, HEAD). С помощью cURL можно получать страницы веб-сайтов, скачивать и закачивать файлы. В этой инструкции будет показано, как выгрузить файл с помощью cURL методом POST.
Суть очень проста. Каждый из нас множество раз выгружал файлы с компьютера на сайт, например, фотографию для профиля или файл в файлообменник. Мы используем веб-браузер, который методом POST отправляет файл. Вместо браузера можно отправлять файл с помощью команды curl, которая также умеет использовать метод POST.
На сервере создайте файл uploader.php:
<?php if (!empty ($_FILES)) { $uploaddir = '/srv/http/upload/'; # укажите папку для загрузки, в которую у сервера есть права записи! $uploadfile = $uploaddir . basename($_FILES['file']['name']); if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) { echo "OK.\n"; } else { echo "NOT OK!\n"; } } else { echo 'I did not get POST!'; }
С компьютера, с которого нужно выгрузить файл, запустите команду вида:
curl -F "file=@/путь/до/файла" СЕРВЕР/uploader.php
Опция -F/--form <ИМЯ=КОНТЕНТ> для семейства протоколов HTTP означает эмулировать заполненную форму, в которой пользователь нажал кнопку «Отправить». Это приводит к тому, что curl отправляет данные методом POST используя Content-Type multipart/form-data.
Обратите внимание на символ @ - он нужен для того, чтобы параметру file было присвоено не значение строки «/путь/до/файла», а содержимое того самого файла, который находится по пути /путь/до/файла.
Пример команды:
curl -F "file=@/etc/passwd" 192.168.0.89/uploader.php
Обратите внимание, что содержимое файла присваивается переменной file. В скрипте выше этой переменной соответствует переменная выгрузки (массив) $_FILES[‘file’]. При изменении имени, не забывайте менять его как в отправляемых данных, так и в скрипте на стороне сервера.
Опцию -F можно использовать несколько раз, чтобы перечислить все поля формы.
curl \ -F "userid=1" \ -F "filecomment=Это файл изображения" \ -F "image=@/home/user1/Desktop/test.jpg" \ localhost/uploader.php
Как эмулировать отправку из формы в cURL
С помощью опции -F можно эмулировать отправку формы и без файла. Например, в следующем примере отправляются два текстовых поля:
curl -F name=John -F shoesize=11 https://example.com/
В следующем примере файл отправляется в виде простого текста, но его содержимое берётся из локального файла hugefile.txt, обратите внимание на использование символа перенаправления вывода <
curl -F "story=<hugefile.txt" https://example.com/
Можно сказать curl какой Content-Type использовать с помощью 'type=' примерно следующим образом:
curl -F "web=@index.html;type=text/html" example.com
или
curl -F "name=daniel;type=text/foo" example.com
Вы также можете явно изменить поле имени загрузки файла, установив filename=, например так:
curl -F "file=@localfile;filename=nameinpost" example.com
Если имя файла/путь содержат ',' или ';', то оно должно быть заключено в двойные кавычки, примерно так:
curl -F "file=@\"localfile\";filename=\"nameinpost\"" example.com
или
curl -F 'file=@"localfile";filename="nameinpost"' example.com
Обратите внимание, что если имя файла/путь заключено в двойные кавычки, любая двойная кавычка или обратная косая черта в имени файла должна быть экранирована обратной косой чертой.
Кавычки также должны применяться к нефайловым данным, если они содержат точки с запятой, начальные/конечные пробелы или начальные двойные кавычки:
curl -F 'colors="red; green; blue";type=text/x-myapp' example.com
Вы можете добавить пользовательские заголовки в поле, установив заголовки headers=, примерно так:
curl -F "submit=OK;headers=\"X-submit-type: OK\"" example.com
или
curl -F "submit=OK;headers=@headerfile" example.com
Связанные статьи:
- Как отобразить данные POST с cURL (РЕШЕНО) (80%)
- Как посмотреть HTTP заголовки (80%)
- Как отправить HTTP запрос OPTIONS из командной строки (РЕШЕНО) (80%)
- Ошибка «curl: (1) Received HTTP/0.9 when not allowed» (РЕШЕНО) (80%)
- Как с помощью PhantomJS отправить POST запрос и получить содержимое страницы (70%)
- Как подключиться к сети Tor через мост в Linux (RANDOM - 50%)