从一个服务器上传文件到另一个服务器(通过HTTP POST)

5
我有一个在客户计算机上运行的Apache服务器,并安装了PHP。我已经安排了一个任务来自动创建数据库备份,并且它工作得很好。但是,将备份保留在系统运行的同一硬盘上没有任何意义,所以我必须将其发送到其他地方。
起初,我尝试使用PHP FTP上传,但客户端的防火墙阻止了所有FTP连接,我无法解除阻止(他的公司不允许我这样做)。
然后,我尝试将备份发送到电子邮件帐户,也没有成功。所有SMTP连接也被阻止了(我知道...)。
现在,我正在尝试通过HTTP POST请求访问一个网页(在我的服务器上),并将文件附加在页面标头中。应该是可能的,因为这几乎就是浏览器使用文件输入对象所做的事情,对吧?我只需使用页面标头发送multipart/data即可。
我需要手动创建页面标头吗?还是已经有脚本可以完成这个任务?
3个回答

5

您可以使用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
你可能想以某种方式在帖子数组中命名文件。 - Maerlyn

2
您可以使用此脚本在服务器端生成带文件上传的POST请求(使用Content-Type:multipart/form-data)。
在接收服务器上,您可以使用另一个脚本通过POST请求加载文件。
但是不要忘记,文件上传通常是Web应用程序安全性的弱点,因此在将代码应用于生产服务器之前,请阅读此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 
?>

2
你也可以使用scp来复制它,这就是我使用的方法。你也可以使用cron自动设置它进行复制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接