将文件从一台服务器上载到另一台服务器(通过HTTP POST)


Uploading file from one server to another (via HTTP POST)

我在客户的计算机上运行了一个Apache服务器,并安装了PHP。我已经安排了一个任务来自动创建一个数据库备份,它工作得很好。但是把备份保存在系统运行的同一个高清上是没有意义的,所以我必须把它发送到其他地方。

起初,我试着做一个PHP FTP上传,但客户端的防火墙阻止了所有的FTP连接,我不能解除阻止(他的公司不允许我)。

然后,我尝试使用SMTP将备份发送到一个电子邮件帐户。也没起作用。所有SMTP连接也被阻止(我知道…)。

我现在试图访问一个网页(在我的服务器上),通过HTTP POST请求,与附加在页头上的文件。这应该是可能的,浏览器就是这么做的,对文件输入对象?我只是使用页头发送multipart/data。

我必须手动创建页眉吗?或者已经有这样的脚本了吗?

您可以使用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']

您可以使用这个脚本在服务器端生成一个带有文件上传的POST请求(使用Content-Type: multipart/form-data)

在接收服务器上,您可以使用另一个脚本通过POST请求加载文件。

但是不要忘记,文件上传通常是web应用程序安全性的薄弱环节,所以在将代码应用到生产服务器之前,请阅读此pdf。


更新:

经过一分钟的思考,我意识到,简单的php复制函数也是一个很好的解决方案,从一个服务器传输文件到另一个!如果您不是必须使用POST请求,那么这将有效。

这种方法有两个优点:

这更简单

2)文件传输可以在post请求后进行,异步下载文件

3)如果传输的文件是动态生成的,可以实现

如果连接失败,服务器可以再次请求文件
<?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 
?>

您也可以使用scp将其复制过来,这就是我使用的。您也可以使用cron将其设置为自动复制