Загрузка файла на сервер с использованием 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:
$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:
print_r( $_POST );
print_r( $_FILES );
move_uploaded_file ( $_FILES['upload']['tmp_name'], 'image.gif' );
?>
Результат работы:
(
[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.
Ссылки по теме:
Ivan:
Если не работает попробуйте полный путь до файла с двумя слэшами, пример:
$file = array(’file’=>”@C:\\home\\localhost\\file.txt”);
21 Январь 2009, 12:00alcorp:
Нифига не работает, при $result = curl_exec ($ch); $result = false.
Как Вы делали непонятно. С полным путем тоже не работает.
30 Июль 2009, 19:33admin:
alcorp:
31 Июль 2009, 13:48Загрузка файла на сервер с использованием CURL