3 способа загрузки файла на сервер с помощью curl

Продемонстрируем curl запрос на примере, с учетом следующих ограничений.
1. Файл надо загрузить методом POST
2. Необходима авторизация
3. На сервере установлен сертификат ssl

Способ 1, командная строка: Загрузка файла непосредственно через командную строку выглядит так:

curl -i -u user:password -X POST --form datafile=@/path/to/some/file.txt https://localhost:443/page --insecure

Разберем подробнее:
-X — указываем метод POST
-u — логин и пароль пользователя
—insecure — при работе по https часто приходится тестировать в тестовом окружении где не стоит проверенный сертификат. Этой опцией отказываемся от проверки.
Чтобы ещё более подробно узнать о тонкостях команды, используйте curl —help

Способ 2, PHP: Продемонстрируем как загрузить файл

// очень полезно предварительно сделать проверку на наличие библиотеки curl для php
if  (!in_array  ('curl', get_loaded_extensions())) {
    exit("CURL is NOT installed on this server");
}

        $ch = curl_init();
        //указываем url адрес на сервере
        curl_setopt($ch, CURLOPT_URL, 'https://localhost:443/page');
        // чтобы возвращало
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        // указываем метод POST
        curl_setopt($ch, CURLOPT_POST, 1); 
        // этот параметр для указания логина и пароля
        curl_setopt($ch, CURLOPT_USERPWD, "login:password");
        curl_setopt($ch, CURLOPT_POSTFIELDS, [
                'some_more_data' => 'здесь можно передать дополнительные параметры, например если эмулируется отправка формы',
                'datafile' => curl_file_create('/path/to/file.txt' , mime_content_type($path_to_file), basename('/path/to/file'))
            ]
        );
        // проверка peer для ssl отключена, смотрите также CURLOPT_SSL_VERIFYHOST для полного игнорирования ssl сертификата
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
        // все опции выставлены - выполняем запрос
        $result = curl_exec($ch);
        // распечатываем ответ сервера
        var_dump($result); 
        // закрываем соединение
        curl_close($ch);

Практически всё прокомментировано в коде, однако отмечу функцию curl_file_create , один сервер постоянно ругался что файл как-то не так указан или отсутсвует. Это вылечилось добавлением мим типа, т.е. функция curl_file_create создает дополнительные заголовки для корректной отправки файла.

Способ 3, Python : Наконец дошли до python, здесь воспользуемя отличной библиотекой requests

import requests

    auth = ('user', 'password')
    data = [
        ('some_more_field', 'some_field_data')
    ]

    # curl request
    files = {'datafile': open('/path/to/file.txt', 'rb')}
    r = requests.post('https://localhost:443/page', files=files, data=data, auth=auth)
    print(r.text)

В указанном примере открываем файл в режиме бинарного чтения, и дальше сразу делаем запроc. В запросе указаны параметры авторизации, метод, страница и файл. Если файлов несколько — просто расширьте словарь files.
Всё просто, удачи с curl!