Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将文件从一台服务器上载到另一台服务器(通过HTTP POST)_Php_File_Upload_Header - Fatal编程技术网

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

Php 将文件从一台服务器上载到另一台服务器(通过HTTP POST),php,file,upload,header,Php,File,Upload,Header,我有一个Apache服务器运行在客户端的计算机上,安装了PHP。我已经安排了一个任务来自动创建一个数据库备份,它工作得很好。但是将备份保存在系统运行的同一硬盘上是没有意义的,因此我必须将其发送到其他地方 起初,我试着做一个PHP FTP上传,但客户端的防火墙阻止了所有FTP连接,我无法解除阻止(他的公司不允许我) 然后,我尝试使用SMTP将备份发送到电子邮件帐户。也没用。所有SMTP连接也被阻止(我知道…) 我现在正试图通过HTTP POST请求访问一个网页(在我的服务器上),该文件附在页面标题

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

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

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

我现在正试图通过HTTP POST请求访问一个网页(在我的服务器上),该文件附在页面标题上。这应该是可能的,因为浏览器就是这么做的,有一个文件输入对象,对吗?我只是使用页眉发送多部分/数据

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

您可以使用它通过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完成的,那么您将以
$\u FILES['file']
的形式访问该文件,您可以使用该文件在服务器端通过文件上载生成POST请求(使用
内容类型:多部分/表单数据

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

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


更新:

经过一分钟的思考,我意识到简单的功能也是将文件从一台服务器传输到另一台服务器的一个很好的解决方案!如果使用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 
?>

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

您可能希望以某种方式在post数组中命名该文件。