Загрузка файла с одного сервера на другой (через HTTP POST) - PullRequest
5 голосов
/ 07 октября 2011

У меня есть сервер Apache, работающий на клиентском компьютере с установленным PHP.Я запланировал задачу автоматического создания резервной копии базы данных, и она работает нормально.Но не имеет смысла хранить резервные копии на том же HD, что и работающая система, поэтому я должен отправить его куда-нибудь еще.

Сначала я попытался сделать PHP FTP-загрузку, но клиентский брандмауэр блокирует все FTP-соединения, и я не могу разблокировать его (его компания не разрешает мне).

Затем я попытался отправить резервную копию с помощью SMTP на учетную запись электронной почты.Также не работал.Все SMTP-соединения также заблокированы (я знаю ...).

Сейчас я пытаюсь получить доступ к веб-странице (на моем сервере) через HTTP POST REQUEST, с файлом, прикрепленным к заголовку страницы.,Это должно быть возможно, видя, что это в значительной степени то, что делает браузер с объектом ввода файла, верно?Я просто отправляю multipart / data, используя заголовок страницы.

Нужно ли создавать заголовок страницы вручную?Или есть сценарии, которые уже это делают?

Ответы [ 3 ]

5 голосов
/ 07 октября 2011

Вы можете использовать curl для отправки через http.Если предположить, что ваш файл '/tmp/backup.tar.gz', он будет выглядеть так:

$ch = curl_init('http://clientserver.com/upload.php');
$ch = curl_setopt($ch, CURLOPT_POST, true);
$ch = curl_setopt($ch, CURLOPT_POSTFIELDS, array('file' => '@/tmp/backup.tar.gz'));
$ch = curl_setopt($ch, CURLOPT_USERPWD, 'username:password');

$result = curl_exec($ch);
if ($result === FALSE) {
   die(curl_error($ch));
}

Это основы.вам, вероятно, нужно сделать его немного более надежным.Предполагая, что скрипт загрузки на принимающем сервере выполнен в php, вы получите доступ к файлу как $_FILES['file'].

2 голосов
/ 07 октября 2011

Вы также можете использовать scp , чтобы скопировать его, вот что я использую.Вы также можете настроить его на автоматическое копирование с помощью cron.

2 голосов
/ 07 октября 2011

Вы можете использовать этот скрипт для генерации POST-запроса с загрузкой файла (используйте Content-Type: multipart/form-data) на стороне сервера.

На принимающем сервере вы можете использовать другой скрипт для загрузки файла через запрос POST.

Но не забывайте, что загрузка файлов, как правило, является слабым местом в безопасности веб-приложений, поэтому прочитайте этот pdf перед применением кода на рабочем сервере.


ОБНОВЛЕНИЕ:

Подумав минуту, я понял, что простая функция php copy также является хорошим решением для передачи файла с одного сервера на другой! Это будет работать, если использование запроса POST не является обязательным для вас.

У этого подхода есть два преимущества:

1) Это проще

2) Передача файла может быть выполнена после отправки запроса, асинхронно загружая файл

3) Может быть реализовано, если переданный файл генерируется динамически

4) Сервер может запросить файл еще раз, если не удается установить соединение

<?php
   //you can run this code in a separate process
   //don't forget to urlencode the file name if it's not encoded yet
   $remote = urlencode( $_POST['filename'] );
   $local = "tempdir_outside_your_http_root/local_file.dat"; 
   if(!copy($remote, $local)){
       throw ....
   }
   if(check_for_security($local)){
      //if all is ok, move to the desired folder
      $final = "uploads/safe_file.dat"; 
      rename($local, $final);
   }else{
      unlink($local);
   }
   //PS: this code is an example, it has strong security vulnerabilities
   //use single-use tokens so that $_POST['filename'] could not be faked 
?>
...