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

时间:2011-10-07 16:22:00

标签: php file upload header

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

起初,我尝试进行PHP FTP上传,但是客户端的防火墙阻止了所有FTP连接,我无法解锁它(他的公司不允许我)。

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

我正在尝试通过HTTP POST REQUEST访问网页(在我的服务器上),页面标题上附有文件。应该有可能,通过文件输入对象看到这几乎就是浏览器所做的,对吗?我只是使用页眉来发送multipart / data。

我是否必须手动创建页眉?或者是否有任何脚本已经这样做了?

3 个答案:

答案 0 :(得分: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 :(得分:2)

您可以使用this script在服务器端生成带文件上传的POST请求(使用Content-Type: multipart/form-data)。

在接收服务器上,您可以使用another script通过POST请求加载文件。

但不要忘记文件上传通常是Web应用程序安全性的弱点,因此在生产服务器上应用代码之前请先阅读this pdf


更新:

在思考了一分钟后,我意识到简单的php copy功能也是将文件从一台服务器传输到另一台服务器的好方法!如果使用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 :(得分:2)

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