zaLinux.ru

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


Метод 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

 


Рекомендуемые статьи:

Оставить комментарий

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