Загрузка файла с одного сервера на другой (через HTTP POST)

#php #file #upload #header

#php #файл #загрузка #заголовок

Вопрос:

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

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

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

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

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

Ответ №1:

Вы можете использовать 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'] .

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

1. Возможно, вы захотите как-то назвать файл в массиве post.

Ответ №2:

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

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

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


Обновить:

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

Этот подход имеет два преимущества:

1) Это проще

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

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 
?>
  

Ответ №3:

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