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

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

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

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

Это теория. А теперь практика. Используя библиотеку CURL отправим на сервер POST-запрос типа multipart/form-data:

<?php
$upload = 'image.gif';
$postdata = array( 'name' => 'evgenijj',
                   'email' => 'evgenijj@mail.ru',
                   'message' => 'Какое-то сообщение от пользователя evgenijj',
                   'upload' => "@".$upload );

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://server.com/getfile.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_exec($ch);
curl_close($ch);
?>

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

<?php
print_r( $_POST );
print_r( $_FILES );
move_uploaded_file ( $_FILES['upload']['tmp_name'], 'image.gif' );
?>

Результат работы:

Array
(
    [name] => evgenijj
    [email] => evgenijj@mail.ru
    [message] => Какое-то сообщение от пользователя evgenijj
)
Array
(
    [upload] => Array
        (
            [name] => image.gif
            [type] => image/gif
            [tmp_name] => C:\WINDOWS\TEMP\php71.tmp
            [error] => 0
            [size] => 100405
        )

)
Array
(
    [url] => http://localhost1/getfile.php
    [content_type] => text/html
    [http_code] => 200
    [header_size] => 193
    [request_size] => 193
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 2.063
    [namelookup_time] => 0
    [connect_time] => 0
    [pretransfer_time] => 0
    [size_upload] => 100943
    [size_download] => 349
    [speed_download] => 169
    [speed_upload] => 48930
    [download_content_length] => 349
    [upload_content_length] => 100943
    [starttransfer_time] => 2
    [redirect_time] => 0
)

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

Ссылки по теме:

Комментариев: 3

  1. Ivan:

    Если не работает попробуйте полный путь до файла с двумя слэшами, пример:

    $file = array(’file’=>”@C:\\home\\localhost\\file.txt”);

  2. alcorp:

    Нифига не работает, при $result = curl_exec ($ch); $result = false.

    Как Вы делали непонятно. С полным путем тоже не работает.

Оставьте свой отзыв