Как отправить файл на сервер (продолжение)

В одной из предыдущих заметок я рассматривал способ отправки файла с одного сервера на другой. Используя сокеты, мы отправляли POST-запрос с сервера first.com на сервер second.com. Но данный способ работает для относительно небольших файлов (примерно до 2-х мегабайт, для получения более точного значения необходимо смотреть в настройках PHP максимальный объем принимаемых данных методом POST).

Чтобы обойти это ограничение, будем передавать файл методом PUT, используя библиотеку CURL. Для этого мы должны инициализировать сеанс CURL, задать для сеанса необходимые параметры, выполнить запрос CURL и закрыть сеанс.

<?php
// Задаем скрипт на сайте second.com, который примет наш запрос и обработает его
$url = 'http://second.com/getfile.php';

// Файл, который мы хотим передать сайту second.com
$file = 'pricelist.csv';

// Узнаем размер передаваемого файла
$filesize = filesize($file);

// Узнаем имя файла (в случае, если в $file указан полный путь до файла)
$pathinfo = pathinfo($file);
$filename = $pathinfo['basename'];

// Открываем передаваемый файл на чтение для дальнейшей его передачи
$fp = fopen($file, 'r');

// Инициализируем сеанс CURL
$ch = curl_init();

// Задаем параметры для открытого сеанса CURL

// Указываем URL скрипта, который примет наш запрос. К имени скрипта
// добавляем переменную, содержащую имя передаваемого файла
curl_setopt($ch, CURLOPT_URL, $url . '?filename=' . $filename);

// Указываем файл (а вернее дескриптор открытого на чтение файла),
// который собираемся передать
curl_setopt($ch, CURLOPT_INFILE, $fp);

// Указываем размер отправляемого файла
curl_setopt($ch, CURLOPT_INFILESIZE, $filesize);

// Указываем, что файл передается методом PUT
curl_setopt($ch, CURLOPT_PUT, 1);

// Указываем, что будет производиться закачка на удаленный сервер
curl_setopt($ch, CURLOPT_UPLOAD, 1);

// Выполняем запрос CURL
curl_exec($ch);

// Завершаем сеанс CURL
curl_close($ch);
?>

После выполнения этого скрипта с сайта first.com на сайт second.com уйдет PUT-запрос, в котором будет находится содержимое передаваемого файла, а в переменной GET['filename'] будет содержаться название передаваемого файла.

Далее нам необходимо организовать прием файла на сайте second.com. Для этого в скрипте getfile.php, находящегося на сайте second.com, из массива $_GET мы должны получить название файла, а из входного потока — содержимое файла:

<?php
// Определяем имя файла; если не определено, задаем как unknow.dat
$filename = (isset($_GET['filename'])) ? $_GET['filename'] : 'unknow.dat';
// Получаем содержимое входящего потока
$content = file_get_contents('php://input');
// Записываем содержимое потока в файл
$file = fopen($filename, 'w+');
fwrite($file, $content);
fclose($file);
echo '<p>Файл получен</p>';
?>

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

Один комментарий

  1. Java:

    Есть вариант использовать curl в *nix среде.

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