СтатьиКак отправить файл на серверВ ходе разработки одного из проектов возникла задача отправлять с сайта A на сайт B архив с файлами, который в дальнейшем надо раскрыть на сайте B. Причем файл должен динамически генерироваться на сайте A, и отправляться в автономном режиме из PHP-скрипта без участия всевозможных форм и т.д. Я решил эту задачу двумя методами, и хочу поделиться ими с вами ... Метод 1: отправка файла методом POSTИдея заключается в том, что на сайте A формируется POST-запрос, который в себе содержит название и содержимое файла, который нужно передать, и посылается на сайт B. На сайте B POST-запрос принимается, и в указанный файл пишется указанное содержимое. Технологию передачи POST-запроса из PHP-скрипта я возложил на сокеты. Для того, чтобы передать данные методом POST, требуется сформировать строку, содержащую заголовки запроса и непосредственно сами данные. Примерный вид строки, отсылаемый на сервер, может быть таким:
<?php
Как вы видите, переменные в POST-запросе задаются как при GET-запросе, т.е.
Далее открываем сокет при помощи функции
$fp = fsockopen('serverB', 80, $errno, $errstr, 30);
Отдаем данные в открытый сокет и читаем ответ сервера B:
fwrite($fp, $zapros);
Закрываем сокет:
fclose($fp);
В результате работы скрипта с сайта A уходит POST-запрос на сайт B, а именно в скрипт
Все, что нам нужно, так это открыть на запись файл с именем
$file = fopen($_POST['filename'], 'w+');
Все! Файл принят и сохранен!
Но есть одно НО: передаваемый файл может быть любого типа. И бинарный и текстовой. Как вы видели, содержимое файла передается в POST-запросе в виде
Чтобы этого избежать, содержимое файла перед отправкой необходимо преобразовать к URL-неактивному виду. Сделать это можно при помощи функции
$file_content = base64_encode("<путь до файла>");
и уже переменную
<?php
В этом случае содержимое файла будет передано в "безопасном" виде.
Прием и "дешифрацию" содержимого файла на сайте B можно осуществить при помощи функции
$file = fopen($_POST['filename'], 'w+');
Стоит отметить, что данный способ прекрасно работает для относительно небольших файлов (примерно до 2-х мегабайт, для получения более точного значения необходимо смотреть в настройках PHP максимальный объем принимаемых данных методом POST). Как раз столкнувшись с ограничением по размеру передаваемого файла, предлагаю следующий метод передачи файлов. Метод 2: отправка файла методом PUTКак уже говорилось, отправка файлов на удаленный сервер методом POST через сокеты хороша для файлов маленьких размеров. Для передачи файлов больших размеров необходимо применить передачу методом PUT. Для этого воспользуемся библиотекойcurl .
Краткая аннотацияВ PHP включена поддержка libcurl — библиотеки функций, написанной Daniel Stenberg, которая позволяет взаимодействовать с различными серверами по различным протоколам. В настоящее время libcurl поддерживает протоколы http, https, ftp, gopher, telnet, dict, file, и ldap. libcurl также умеет работать с сертификатами HTTPS, посылать запросы к HTTP серверам методами POST и PUT, закачивать файлы по протоколам HTTP и FTP (последнее можно сделать также используя модуль FTP), использовать прокси-серверы, cookies и аутентификацию пользователей. Для передачи файла методом PUT нам необходимо инициализировать сеанс CURL, задать для сеанса необходимые параметры, выполнить запрос CURL и закрыть сеанс.
Следующий пример демонстрирует передачу файла
<?php
После выполнения этого сценария с сайта A на сайт B уйдет PUT-запрос, в котором будет находится содержимое передаваемого файла, а в GET-запросе будет содержаться название передаваемого файла. Далее нам необходимо организовать прием файла на сайте B.
Для этого в скрипте
<?php
Таким методом можно передавать файлы больших объемов.
Стоит наверное также упомянуть, что приведенные выше два способа передачи файлов не являются единственно возможными способами. Например, можно передавать файлы из PHP-скриптов на удаленные сервера по FTP-протоколу (используя тот же CURL или специальные функции PHP, такие как Также обращаю ваше внимание, что указанные здесь методики освещают возможность загрузки файлов на сервер. Использование их "в чистом виде" без доработки может быть небезопасным, и является потенциальной возможностью для взлома вашего сайта. А именно, отсутствие обработки имени файла, который пришел на сайт B, отсутствие авторизации, определения сайта, посылающего файл, может дать злоумышленнику возможность загрузить и выполнить вредоносный код на вашем сайте. Рассмотрение способов защиты не входит в данную статью и остается на ваше усмотрение ... Источник: http://www.spravkaweb.ru |
||